我的一位“非程序员”朋友最近决定制作一个C ++程序来解决一个复杂的机械问题。
他在一个单独的.cpp文件中编写了每个函数,然后将它们全部包含在主源文件中,如下所示:
main.cpp中:
#include "function1.cpp"
#include "function2.cpp"
...
int main()
{
...
}
然后使用单个gcc行编译代码:
g++ main.cpp // took about 2 seconds
现在,我知道这应该可行,但我不确定是否将.cpp文件直接包含在主程序中是一个好主意。我已多次看到以下方案,其中所有函数原型都使用extern关键字进入头文件,如下所示:
funcs.h:
extern void function1(..);
extern void function2(..);
...
main.cpp中:
...
#include "funcs.h"
...
&安培;编译:
g++ -c function1.cpp
g++ -c function2.cpp
...
g++ -c main.cpp
g++ -o final main.o function1.o function2.o ...
我认为这个方案更好(使用makefile,ofcourse)。有什么理由可以让我的朋友这么说服他?
答案 0 :(得分:21)
人们按对象编译对象的主要原因是节省时间。高级本地化代码更改通常只需要编译一个对象和重新链接,这可能更快。 (如果公共代码中的更改触发更全面的重新编译,编译太多标题中的对象或冗余地实例化相同模板,实际上可能会更慢)。
如果项目太小以至于可以在2秒内编译,那么传统方法实际上并没有太大的好处,尽管做出预期可以节省开发人员的时间 - 就像你和我们这样:-)。平衡这一点,维护一个makefile也需要时间,尽管为了方便地捕获包含目录,库,编译器开关等,你最终可能会这样做。
对书面/生成代码的实际影响:
BTW - 在C ++中,您的标题可以在不明确使用extern
关键字的情况下声明函数,这样做是正常的。
答案 1 :(得分:6)
第二种风格的原因是因为每个.cpp文件都可以单独处理,有自己的类,全局变量等,而且没有冲突风险。
自动链接所有.cpp文件(如MSVC)的IDE也更容易。