首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

本人初学者,一个简单的C/C++编译与文件包含的有关问题

2012-10-31 
本人菜鸟,请教高手一个简单的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++ code
void 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"书写来得方便,总之竟然效率一样,就要从方便程序的编写和阅读这方面来进行选择。

热点排行