作者 | 梁唐
大家好,我是梁唐。
这是EasyC++系列的第44篇,单独编译。
在上一篇当中,我们编写好了头文件coordin.h
,现在我们要完成它的实现。
头文件当中只能放一些生命和常量的定义,不能有具体的实现。所以我们要把具体的实现单独放入一个cpp文件当中。因为我们的头文件叫做coordin.h
,那么我们与之对应的cpp文件自然就叫做coordin.cpp
。
在coordin.h
当中我们声明了两个函数,自然我们就要完成这两个函数的实现:
#include <cstdio>
#include <iostream>
#include <cmath>
#include "coordin.h"
using namespace std;
polar rect_to_polar(rect xypos) {
polar answer;
answer.distance = sqrt(xypos.x * xypos.x + xypos.y * xypos.y);
answer.angle = atan2(xypos.y, xypos.x);
return answer;
}
void show_polar(polar dapos) {
const double rad_to_deg = 57.29577951;
cout << "distance = " << dapos.distance;
cout << ", angle = " << dapos.angle * rad_to_deg;
cout << " degress" << endl;
}
这两个函数一个完成的是直角坐标到极坐标的转换,还有一个是极坐标的输出,输出的时候还包括了一个弧度到角度的转化。
最后我们再来看main
函数:
#include "coordin.h"
using namespace std;
int main() {
rect rplace;
polar pplace;
while (cin >> rplace.x >> rplace.y) {
pplace = rect_to_polar(rplace);
show_polar(pplace);
}
}
这里有一个小细节,我们在引入coordin.h
的时候使用的是双引号,而不是<>
符号。因为如果使用的是尖括号,那么C++编译器将在存储标准头文件的文件系统当中去查找这个头文件,如果是双引号则会在当前目录或源代码目录查找。
还有虽然我们用到的函数实现是在coordin.cpp
当中实现的,但我们并不需要将它include
进来。而是在之后编译的时候连接进来。
现在我们的代码都已经写好了,但是我们有两个cpp文件,要怎么编译运行呢?
我们可以使用g++ -c
命令,将cpp代码编译成目标代码。
g++ -o coordin.cpp
编译之后,我们将会得到一个coordin.o
文件,我们再继续编译main.cpp
文件:
g++ -o main.cpp
这样我们就得到了两个.o文件,最后,我们需要把这两个.o文件连接到一起编程一个可执行文件:
g++ coordin.o main.o -o cur
当然,我们也可以把main.cpp
的编译和连接步骤合并在一起:
g++ main.cpp coordin.o -o cur
我们单独对每个文件编译的好处是,比如当我们只需要改动main.cpp
的时候,coordin.cpp
文件可以不用再编译,从而节省编译运行的时间。我们都知道,大型的C++项目的编译是非常耗时的。
当然大型项目当中,我们一般也不会手动编译项目,而会使用例如make
等一些自动编译脚本。