2011-12-01 41 views
10

C++和C中的翻译单元有什么不同?C和C++中的翻译单元

在其他文章中,我读到一个头文件和源文件构成一个翻译单元,但是 可以单独将一个源文件称为C++中的翻译单元,它包含一个文件中的所有定义?

+4

预处理的源文件是翻译单元。 –

+1

@KerrekSB难道不是答案吗? – daramarak

+0

@KerrekSB,代表帽? :) –

回答

22

翻译单元不是“标题和源文件”。它可能包含一千个头文件(还有一千个源文件)。

翻译单元在被预处理后就是通常所说的“源文件”或“.cpp文件”。如果源文件#include是其他文件,那么这些文件的文本将被预处理器包含在翻译单元中。 C和C++在这个问题上没有区别。

+0

如果我将我的类定义放在'.cpp'中,而不是使用'.h'来放置类声明。我可以称这个'.cpp'为翻译单位吗? – user103214

+1

是的,没有头文件的要求。 –

+3

@ user974191:你应该使用头文件来避免复制你的代码。 '#include'机制允许你编写一次并让编译器为你复制它:这是一个代码组织的问题,但与翻译单元的概念没有多大关系。 –

1

在预处理时,头文件被添加到.cpp文件中,所以编译器基本上正在处理一大段代码,包含.cpp和所有.h文件,都是由“#include”添加的。

这是翻译单元。

0

翻译单元实际上就是源文件和头文件通过预处理(它使用头文件扩展源文件)和预编译后获得的内容。编译器使用翻译单元生成您在编译器输出目录中看到的.obj文件。

+0

- 预编译(据我所知,没有这样的步骤) –

+1

生成预编译头文件 - 在大型C++项目中很常见。 – ChrisBD

+0

啊!我不会真的把它编成预编,但我现在明白了。至于常见......是和不是。我正在研究共享数百万行代码的项目,而最好的解决方案不是预编译头文件,而是在同一团队(CCache)的开发人员之间共享生成的对象并分发构建。 –

1

这取决于你的意思“区别”。 C和C++ 对其进行了类似的定义:基本上,编译源文件(因此,所有包含的头文件,扩展的宏等)时编译的所有内容。但这在两种语言中并不是一回事; 之类的模板意味着翻译单元不使用C表现不同 ++比C.(C++有一个定义规则,例如。)

+0

可以通过一个定义规则在两个.cpp文件中有两个具有相同名称的类定义吗?谢谢。 – user103214

+0

@ user974191只有它们包含完全相同的标记,并且所有符号都绑定到完全相同的东西。这就是为什么引入了未命名的命名空间的原因:将本地类放在一个未命名的命名空间中,并且它们的完全限定名称是不同的;他们不再是同一个班级,因为他们不再有相同的名字。 –

-2

组由编译器看到的源文件和转换为一个单元

+0

如果你能用完整的句子解释你的答案会更有用。 – ilke444