2017-09-15 53 views
-2

假设#include <something.h>包含在A.cpp及B.cpp这个文件编译两次?

,如果我在A.cpp与功能“B”在B.cpp在主运行某些功能“A”,

是“ something.h“编译了两次?或一次?

+1

在'something.h'的代码在这种情况下被编译两次,是的。这听起来像一个XY问题 - 你有这个更大的问题吗? –

回答

-1

因为它是一个头,这不是“编译”。 它列为你的代码的一部分。

,避免一些尴尬的局面,你必须保护你的头是这样的:

#ifndef SOMETHING_H_ 
#define SOMETHING_H_ 

/* your code goes here */ 

#endif /* something.h */ 
0

错误的问题。什么是编译在技术上是一个源文件,而是一个translation unit

阅读C++更加几本书,还有一些reference网站。

了解也更多有关各种compilation phases,其中包括preprocessing

因此,假设你的编译器是GCC在Linux上,你将与

g++ -Wall -Wextra -g -c A.cpp -o A.o 

编译A.cpp源文件(也它使用的头,所以翻译单元),其中-Wall要求几乎所有的警告, -Wextra询问更多的人,-g询问调试信息(在Linux DWARF格式),-c要求仅用于编译,-o A.o询问对象文件是A.o

你可以请编译器使用-H选项显示每个包含的标题。

你可以使用

g++ -Wall -Wextra -g -C -E A.cpp > A.ii 

那么你可以看看与寻呼机(或编辑)到生成A.ii文件得到预处理形式。

当然预处理将包括一个报头的预处理形式在点是#include -d