本人菜鸟,请教高手一个简单的C/C++编译与文件包含的问题比如,在1.cpp中,有代码如下:C/C++ code#include i
本人菜鸟,请教高手一个简单的C/C++编译与文件包含的问题
比如,在
1.cpp中,有代码如下:
C/C++ code#include <iostream>using namespace std;void display(){ cout << "Hello world!" << endl;}
在2.cpp中,有代码:
C/C++ codevoid display();int main(){ display(); return 0;}
将两者一起编译,运行,显示 "Hello world!".
若调整2.cpp的代码如下
C/C++ code#include "1.cpp"int main(){ display(); return 0;}
后,仅编译2.cpp,运行,结果仍为"Hello world!".
想请问论坛里的高手,这两种方式产生的可执行文件究竟有什么区别.
本人菜鸟,请多多包含.
测试系统:Ubuntu Linux 12.04
编译器: G++ 4.63
[解决办法]先说说#include ""与#include <>,""是先搜索用户目录,用户目录里没有再搜索系统默认目录,<>是直接搜索系统默认目录。
凡是#XXX这里预编译的东西都不会参与编译运行,而是先在含有预编译的命令的源文件进行翻译,例如2.cpp
#include "1.cpp"
int main()
{
display();
return 0;
}
先翻译成
#include <iostream>
using namespace std;
void display()
{
cout << "Hello world!" << endl;
}
int main()
{
display();
return 0;
}
然后再对2.cpp进行编译连接运行,整个过程中1.cpp只参与生成翻译单元的环节而没参与编译连接运行
详情请见孙鑫vc视频教程第二课末尾段。
[解决办法]一个是源代码合体后进行编译连接,另一个是源代码各自编译后再进行连接,没啥区别。就拿你的程序来说,#include "1.cpp"与main前头的void display()是等价的,生成的可执行文件是一样的。Linux的我不知道,windows的话通常不用#include "xxx.cpp",而是#include "xxx.h",就是把类的声明写在h头文件里,类的实现写在另一个名字相同的cpp里,h文件都是用来预编译的因而都不能参与编译连接。一个基本的windows程序就是由多个类的h文件和cpp文件以及一个含WinMain(main)函数的cpp文件组成,主文件里只包含类的h文件而不包含cpp文件。
一般文件之间的函数调用习惯上都用void display()而不用#include "1.cpp",如果1.cpp里包含了多个函数的定义,当然用#include "1.cpp"书写来得方便,总之竟然效率一样,就要从方便程序的编写和阅读这方面来进行选择。