【问题标题】:Translation unit in C and C++C 和 C++ 中的翻译单元
【发布时间】:2012-01-10 15:32:31
【问题描述】:

C++ 和 C 中的翻译单元有什么区别吗?

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

【问题讨论】:

  • 预处理的源文件是翻译单元。
  • @KerrekSB 这不是答案吗?
  • 不,只是有时我认为“答案”应该包含最少的文字,当我没有那么多话要说时,我只是评论......
  • @KerrekSB,你说得有道理。不过,我认为这是以尽可能短的文本传达信息的问题。您的评论(在我看来也是如此)完美地回答了描述。
  • @MichaelKrelin-hacker:确实,有些“著名答案”是单行的……称之为个人不情愿;我所做的大多数事情背后都没有复杂的原因:-)

标签: c++ c


【解决方案1】:

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

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

【讨论】:

  • 如果我将类定义放在.cpp 中,而不是使用.h 来放置类声明。我可以称其为.cpp 翻译单元吗?
  • 是的,不需要头文件。
  • @user974191:您应该使用标头来避免一遍又一遍地复制您的代码。 #include 机制允许您编写一次并让编译器为您复制它:不过这是代码组织的问题,与翻译单元的概念没有太大关系。
  • 它可能包含一千个头文件(以及一千个源文件)。//我不明白。一个翻译单元怎么可能有很多 .c 文件?请帮忙
  • @Karthik 与标题相同:#include。不过,这不是一个好主意。
【解决方案2】:

在预处理时将标头添加到 .cpp 文件中,因此编译器基本上在处理一大块代码,其中包含 .cpp 和由“#include”添加的所有 .h。

这是翻译单元。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • - 预编译(据我所知没有这个步骤)
    • 预编译头文件的生成 - 在大型 C++ 项目中相当常见。
    • 啊!我不会真正称其为预编译,但我现在明白了。至于普通……是也不是。我正在处理共享数百万行代码的项目,最划算的不是预编译头文件,而是在同一团队 (CCache) 的开发人员之间共享生成的对象并分发构建。
    【解决方案4】:

    这取决于您所说的“差异”是什么意思。 C 和 C++ 类似地定义它:基本上,当你编译的所有东西 编译一个源文件(因此,所有包含的头文件,扩展 宏等)。但这在两种语言中不是一回事。 模板之类的东西意味着翻译单元的行为确实不同 在 C++ 中比在 C 中。(例如,C++ 有一个定义规则。)

    【讨论】:

    • 一个定义规则可以在两个.cpp文件中有两个同名的类定义吗?谢谢。
    • @user974191 仅当它们包含完全相同的标记并且所有符号都绑定到完全相同的东西时。这就是引入无名命名空间的原因:将本地类放在无名命名空间中,它们的全限定名不同;它们不再是同一个类,因为它们不再具有相同的名称。
    【解决方案5】:

    编译器看到并作为一个单元翻译的一组源文件

    【讨论】:

    • 如果你能用完整的句子解释你的答案会更有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    相关资源
    最近更新 更多