C和C++中的翻译单元

17
在C++和C中,翻译单元的定义有所不同吗?
在其他文章中,我看到一个头文件和源代码文件组成了一个翻译单元,但是在C++中,如果一个源代码文件包含了所有定义,它可以被称为一个翻译单元吗?

6
预处理后的源代码文件是翻译单元。 - Kerrek SB
2
@KerrekSB 那不是一个答案吗? - daramarak
1
不,有时候我认为一个“答案”应该包含一定的最小文本量,当我没有那么多可说的时候,我只是发表评论... - Kerrek SB
@KerrekSB,你说得很有道理。不过我认为,这只是尽可能用最短的文本传达信息的问题。而你的评论(在我看来)完美地回答了这个描述。 - Michael Krelin - hacker
3
@MichaelKrelin-hacker说:“实际上有些‘著名答案’确实只有一句话……这是出于个人的不情愿;我做事情大多没有复杂的理由 :-)” - Kerrek SB
可能是什么是C++中的“翻译单元”的重复问题。 - Alok Save
5个回答

34

一个翻译单元并不是指“一个头文件和一个源文件”,它可以包含数千个头文件(以及数千个源文件)。

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


如果我将类定义放在.cpp文件中而不是使用.h文件来放置类声明,那么我可以称呼那个.cpp文件为翻译单元吗? - user103214
1
是的,没有必须要有头文件的要求。 - R. Martinho Fernandes
3
你应该使用头文件来避免反复复制代码。 #include 机制允许你只需编写一次,编译器就可以帮你复制它:这只是代码组织的问题,与翻译单元的概念没有太大关系。 - Matthieu M.
它可能包括一千个头文件(和一千个源文件)。我不明白。一个翻译单元如何可能有多个.c文件?请帮忙解释。 - Karthik Raj Palanichamy
1
@Karthik 你可以像处理头文件一样处理它:#include。不过这并不是一个好主意。 - R. Martinho Fernandes

3

在预处理期间,头文件被添加到.cpp文件中,因此编译器基本上是在处理一个包含.cpp和所有通过"#include"添加的.h的大块代码。

这就是翻译单元。


1

这取决于你所说的“差异”是什么意思。C和C++都定义了类似的概念:基本上,编译源文件时编译的所有内容(包括所有包含的头文件、扩展的宏等)。但在这两种语言中,这并不是同一件事情;例如,像模板这样的东西意味着翻译单元在C++中的行为与C中不同。(例如,C++有一个定义规则。)


在一个定义规则下,两个 .cpp 文件中是否可以有相同名称的两个类定义?谢谢。 - user103214
只有当它们由完全相同的标记组成,并且所有符号都绑定到完全相同的内容时,它们才是相同的。这就是为什么引入了未命名命名空间的原因:将本地类放在未命名命名空间中,它们的完全限定名称就不同了;它们不再是相同的类,因为它们不再具有相同的名称。 - James Kanze

0

翻译单元实际上是在源文件和头文件经过预处理(使用头文件扩展源代码)和预编译后得到的结果。编译器使用翻译单元来生成您在编译器输出目录中看到的 .obj 文件。


预编译(据我所知,没有这样的步骤) - Matthieu M.
1
预编译头文件的生成在大型C++项目中非常普遍。 - ChrisBD
啊!我不会真的称之为预编译,但现在我明白了。至于是否常见...是和否。我正在处理共享数百万行代码的项目,最划算的做法不是预编译头文件,而是在同一个团队的开发人员之间共享生成的对象(CCache),并分发构建结果。 - Matthieu M.

-2

编译器看到并翻译为一组的源文件


如果您能用完整的句子来解释您的答案,那将更有用。 - ilke444

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接