一个工程中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文件的编译顺序的更多相关文章
- [转载]android工程中引入另一个工程中的资源
原文地址:android工程中引入另一个工程中的资源作者:87fayuan 在项目中可能遇到这样的问题:项目过大,于是细分为N个子模块来做,每个模块都是不同的工程.涉及到activity传数据时,可以 ...
- codec engine工程中使用ccs下编译的lib库
原文地址:codec engine工程中使用ccs下编译的lib库--转作者:木子小白 这两天将dsp的算法程序放到ccs下,生成lib库文件 这样的好处就是: 1. 算法封装成lib库以后,看不到源 ...
- Visual Studio 向工程中添加文件夹
将要添加的文件夹拷贝到工程的目标文件夹中. 打开工程,在Solution Explorer中选中“Show All Files”按钮. 然后VS会显示文件夹中包含,但是不在工程中的文件夹. 右键该文件 ...
- 当打开一个.h或.cpp文件时, Solution Explorer就自动展开文件所在的目录
当打开一个.h或.cpp文件时, Solution Explorer就自动展开文件所在的目录: 如果不想展开: Tools -> Options -&g ...
- VC工程中文件的编译顺序
用联合编译工具能减少大量编译时间,然而如果工程里有个大型cpp文件,其他文件都编译好了只等着它... 两步解决问题: 1.将大文件分散到多个小cpp里面,加快并发,减少单个文件编译时间 2.优先编译大 ...
- VS2008 工程中部分文件不参与编译 从生成中排除【Worldsing笔记】
Visual Studio 2008 .VS2008.VC2008工程源文件配置.编译配置 有时编写代码时,往往存在这样的需求(或是希望有这样的功能):一个工程经过不共同的配置实现不同的版本或是功 ...
- 关于一个多个.cpp文件的项目中,函数出现未定义引用错误
编译的话,必须把全部的c文件都要编译的啊,只编译一个c算怎么个逻辑呢?编译实际上是2个过程,编译和链接.编译过程只检查所有的符号(变量,函数)有没有声明,即只需要h文件生命就够了.但是链接时候,需要找 ...
- Java-Web中访问某个指定工程中的文件,报错后发现访问的文件是另一个工程里面的文件
问题: 浏览器向我的bingou项目中的UserDaoImpl.java发送请求, myeclipse报错:空指针异常 点击报错行之后,错误给定位到了另一个项目中的的一个文件 解决: 原因是文件名错误 ...
- MFC【exe】工程中的文件大致信息(翻译的)
在工程文件夹中有个readme文件,下面是翻译过来的. ======================================================================== ...
随机推荐
- vuex使用面板报 Unexpected token错误
Module build failed: SyntaxError: D:/frontend/webtest/src/components/mutations.vue: Unexpected token ...
- 与drawable的较量(一)
前言 在android ui中drawable 是一个非常关键的要点,因为我们现在使用的花里胡哨的APP,都在胡里花哨的drawable 构建的. drawable,英文翻译为可拖拽的.说白了就是自己 ...
- qiniuLive 连麦流程介绍
本文出自APICloud官方论坛 qiniuLive 封装了七牛直播云服务平台的移动端开放 SDK.该模块包括视频流采集和视频流播放两部分 iOS连麦流程图: Android连麦流程图: 以下部分代码 ...
- SpringCloud之Eureka(服务注册和服务发现基础篇)(二)
一:Eureka简介 Eureka是Spring Cloud Netflix的一个子模块,也是核心模块之一.用于云端服务发现,一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移. ...
- 新上手jupyterlab安装及问题解决
最近jupyter notebook又出了一个新玩法:jupyterlab但是很多小伙伴和我一样,在安装的时候出现了很多问题,于是乎我总结了一下,希望给大家带来帮助 首先,最好保持你的浏览器是最新的版 ...
- 20190925Java课堂记录(一)
判断字符串是否回文 设计思想 利用递归,每次返回长度减二的字符串,最终返回结果 源程序代码 import java.util.Scanner; public class palindrome { st ...
- 查看jvm内存信息
Runtime.getRuntime().maxMemory(); //最大可用内存,对应-Xmx Runtime.getRuntime().freeMemory(); //当前JVM空闲内存 Run ...
- 分布式缓存Redis的持久化方式RDB和AOF
一.前言 Redis支持两种方式的持久化,RDB和AOF.RDB会根据指定的规则“定时”将内存中的数据存储到硬盘上,AOF会在每次执行命令后将命令本身记录下来.两种持久化方式可以单独使用其中一种,但更 ...
- sqli_labs学习笔记(一)Less-1~Less-20
开门见山 Less-1 GET - Error based - Single quotes - String(基于错误的GET单引号字符型注入) · 方法一:手工UNION联合查询注入 输入单引号, ...
- Java程序员学习Go指南(终)
我的博客:https://www.luozhiyun.com/archives/215 context.Context类型 Context类型可以提供一类代表上下文的值.此类值是并发安全的,也就是说它 ...