一个工程中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__,因此都执行了定义工作。

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

原文地址:https://www.cnblogs.com/XiaoXiaoShuai-/p/12003682.html

时间: 2024-10-04 17:42:02

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

[转载]android工程中引入另一个工程中的资源

原文地址:android工程中引入另一个工程中的资源作者:87fayuan 在项目中可能遇到这样的问题:项目过大,于是细分为N个子模块来做,每个模块都是不同的工程.涉及到activity传数据时,可以用intent等方法来解决.但是如果涉及到要共用资源,而又不能像传统java程序那样打成jar包,比如程序中有大量自定义view,而这些自定义view都引用了的一些资源文件时,就可以用这个方法. 工程一:MyViews 代码如下: public class MyTextView extends Te

工程中properties文件处理方法类

功能:properties文件加载.取得key对应的值 1 import java.util.ResourceBundle; 2 3 /** 4 * 工程中properties文件处理方法类 5 */ 6 public class ConfigHolder { 7 private static ResourceBundle bundle; 8 9 /** 10 * 加载properties文件 11 */ 12 private static void loadConfig() { 13 if(b

Java类加载机制——如何实现一个工程中不同模块加载不同版本的同名jar包。

如何实现一个工程中不同模块加载不同版本的同名jar包? 曾是阿里面试的时候遇到的一个面试题.当时就有点晕,如果是平时遇到这样的问题肯定是统一加载相同版本的就好了. 而如果系统特别庞大依赖冲突繁多,涉及多部门协调,真的有必要解决这样的问题. 这个问题困扰我很久,一直没有好的解决办法.最近研究java虚拟机.终于找到了答案. 在JVM里由类名和类加载器区别不同的Java类型.因此,JVM允许我们使用不同的加载器加载相同namespace的java类,而实际上这些相同namespace的java类可以

VS2008 工程中部分文件不参与编译 从生成中排除【Worldsing笔记】

Visual Studio 2008 .VS2008.VC2008工程源文件配置.编译配置 ? 有时编写代码时,往往存在这样的需求(或是希望有这样的功能):一个工程经过不共同的配置实现不同的版本或是功能,比如做开发包的Dome,一个库文件, 有多个API接口,以lib文件给用户提供时,我们需要提供文档和Demo,你可以一个Demo建立一个工程,但是,像VS2008这样的高级开发工具应该有解决 办法的,关键是你不知道怎么用,在VS2008环境下有这样几种解决办法: ? 建立一个工作区,在工作区里建

关于一个多个.cpp文件的项目中,函数出现未定义引用错误

编译的话,必须把全部的c文件都要编译的啊,只编译一个c算怎么个逻辑呢?编译实际上是2个过程,编译和链接.编译过程只检查所有的符号(变量,函数)有没有声明,即只需要h文件生命就够了.但是链接时候,需要找到全部的函数的实现体,不把所有的.cpp一起编译,电脑怎么知道你还有文件呢,它又不是神仙会算.简单说就是,gcc编译必须把全部的c文件一起编译! 在使用code::Blocks应该注意在创建.cpp文件时,将debug和release一起点上 原文地址:https://www.cnblogs.com

MFC【exe】工程中的文件大致信息(翻译的)

在工程文件夹中有个readme文件,下面是翻译过来的. ======================================================================== MICROSOFT FOUNDATION CLASS LIBRARY : Down1========================================================================微软基础类库 AppWizard has created this D

从XCode添加File的错误Multiple errors occurred while copying the files分析Cocos2d-x在XCode工程中添加文件

1.Multiple errors occurred while copying the files问题 关于这个问题,这里有解决办法 大致的意思是 1)添加文件没有全部添加,但是有部分添加成功,再次以文件夹添加之前的文件时会报这样的错误. 2)解决办法:先clean工程,点击上步需要添加文件的父目录,show  in  finder,删除之前添加的文件,重新添加. 这是一个解决办法,但是出现这样的问题还有另外一个原因: 勾选上了1的选项,导致出现上面的错误,直接去掉就可以了. 2.讲一讲Coc

Unity工程中 .Meta 文件

在项目提交的时候,尤其是导入了很多资源的情况下会有很多的.meta文件,那么这些文件是否一定要上传? --------------------- 在游戏开发过程中不可避免的要用到版本控制工具,如SVN,git,也因此需要理解Meta文件的作用. 在游戏场景中引用一个游戏资源,Unity并不直接按照文件路径和名称,而是使用一个独一无二的GUID来指向工程里的该资源文件. GUID储存在Unity工程为每个资源和文件夹生成的Meta文件里. 使用GUID的好处就是,即使你移动.重命名或者修改资源的内

一个项目中哪些文件是要上传到 git上的,哪些是不必要的

经过测试发现除了上面图中的代码,其他的都是要上传到git上的 , .project文件是一个很关键的文件