回答
翻译单元不是“标题和源文件”。它可能包含一千个头文件(还有一千个源文件)。
翻译单元在被预处理后就是通常所说的“源文件”或“.cpp文件”。如果源文件#include
是其他文件,那么这些文件的文本将被预处理器包含在翻译单元中。 C和C++在这个问题上没有区别。
如果我将我的类定义放在'.cpp'中,而不是使用'.h'来放置类声明。我可以称这个'.cpp'为翻译单位吗? – user103214
是的,没有头文件的要求。 –
@ user974191:你应该使用头文件来避免复制你的代码。 '#include'机制允许你编写一次并让编译器为你复制它:这是一个代码组织的问题,但与翻译单元的概念没有多大关系。 –
在预处理时,头文件被添加到.cpp文件中,所以编译器基本上正在处理一大段代码,包含.cpp和所有.h文件,都是由“#include”添加的。
这是翻译单元。
翻译单元实际上就是源文件和头文件通过预处理(它使用头文件扩展源文件)和预编译后获得的内容。编译器使用翻译单元生成您在编译器输出目录中看到的.obj文件。
- 预编译(据我所知,没有这样的步骤) –
生成预编译头文件 - 在大型C++项目中很常见。 – ChrisBD
啊!我不会真的把它编成预编,但我现在明白了。至于常见......是和不是。我正在研究共享数百万行代码的项目,而最好的解决方案不是预编译头文件,而是在同一团队(CCache)的开发人员之间共享生成的对象并分发构建。 –
这取决于你的意思“区别”。 C和C++ 对其进行了类似的定义:基本上,编译源文件(因此,所有包含的头文件,扩展的宏等)时编译的所有内容。但这在两种语言中并不是一回事; 之类的模板意味着翻译单元不使用C表现不同 ++比C.(C++有一个定义规则,例如。)
可以通过一个定义规则在两个.cpp文件中有两个具有相同名称的类定义吗?谢谢。 – user103214
@ user974191只有它们包含完全相同的标记,并且所有符号都绑定到完全相同的东西。这就是为什么引入了未命名的命名空间的原因:将本地类放在一个未命名的命名空间中,并且它们的完全限定名称是不同的;他们不再是同一个班级,因为他们不再有相同的名字。 –
- 1. 跨C++翻译单元初始化
- 2. 翻译c/C++?
- 3. 由当前翻译单元编译的对象的名称C
- 4. c - > c#翻译,工具
- 5. 翻译C++/CLI为C#
- 6. C++翻译成目标-C
- 7. LLVM翻译单元
- 8. 翻译简单的C代码
- 9. C有翻译吗?
- 10. Python翻译为C#
- 11. C到MIPS翻译
- 12. C#等价的python maketrans和翻译
- 13. C翻译的双重
- 14. C#作业的VB翻译
- 15. C#ActionCommand:ICommand到VB.net的翻译
- 16. 从枫到C++的翻译
- 17. C++到Java的翻译
- 18. C++ MVC模型viewmodel“翻译”和继承
- 19. C++代码翻译和解释
- 20. C++代码翻译和名称查询
- 21. 在多个翻译单元中复制C++中的静态成员函数吗?
- 22. 将C#批量翻译为Objective C
- 23. 翻译从C#代码示例为C++
- 24. 如何翻译从C++到Objective-C
- 25. C++新行不翻译
- 26. 将Expokit翻译为C
- 27. 将C#翻译为Powershell
- 28. 谷歌翻译与c
- 29. 翻译从C到MIPS
- 30. C++翻译阶段混乱
预处理的源文件是翻译单元。 –
@KerrekSB难道不是答案吗? – daramarak
@KerrekSB,代表帽? :) –