一个工程中cpp文件的编译顺序

Posted 机智的小小帅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个工程中cpp文件的编译顺序相关的知识,希望对你有一定的参考价值。

做了一个实验。

 

最后build失败,失败的原因是变量i被重定义了。原本按照我的思路,是不应该失败的。因为我用了条件编译,若先编译Source.cpp,则会#define __HEADER_H__并且定义变量i,等到之后再编译main.cpp时,由于已经定义__HEADER_H__,就会跳过变量i的定义。最终i只被定义一次,完美。

 

不管怎么说,编译器是不会出错的,仔细寻找一下原因吧。根据上面的实验结果可以推测出,两个cpp文件中#ifndef 和 #endif之间语句都得到了执行。

将上面的代码稍作改动。

 

 编译没问题,说明i和j确实都没定义过了=>两个cpp中#ifdef和#endif的语句都被执行过了。

 

网上搜索的一下资料,最终得到如下结论:

每个cpp文件都是单独编译的,之后再对所有cpp文件编译后形成的中间文件进行连接。因此在本例中,两个cpp文件都认为自己没有定义__HEADER_H__,因此都执行了定义工作。

 

另外一个收获:在函数外部只能对变量和函数进行声明和定义工作,无法进行变量修改以及调用函数等操作。

 

以上是关于一个工程中cpp文件的编译顺序的主要内容,如果未能解决你的问题,请参考以下文章

linux下使用g++编译cpp工程

在工程中包含两个cpp文件(只有一个有main),那这段程序是怎样运行的?

编号的cpp文件怎么运行

vs2013打开的cpp文件如何编译

Visual Studio 以啥顺序编译源文件?

C++同一工程main该怎么处理?大家好,同一工程下写不同的CPP文件时好像不能用多个main,那么该怎么办呢?