人们常常说,静态变量声明在C/C++不能跨编译单元可见?这是否意味着每个.c或.cpp文件都是独立的编译单元?那么.h文件和.h文件中声明的静态变量怎么样? .h文件是否也被视为单独的编译单元?
15
A
回答
27
头文件没有单独的生命,只有它们的内容是#included
到.c或.cpp文件中。但由于#include
是由预处理器处理的,因此编译器不了解不同的头文件;它只将结果代码列表看作输入。这就是所谓的编译单元:一个源文件,其所有#include
指令被替换为相关头文件的内容。
4
编译器只处理源文件,通常使用扩展名.c或.cpp。编译器并不关心包含的文件:只要通常实现编译器,就会重新处理每个.c/.cpp文件,无论读取什么.h文件(由预处理器提供)。
这就是为什么我们谈论'编译单元':一次编译的内容,其结果可能随后被链接到可执行文件中。
8
C和C++汇编(通常)分割在三个独立的步骤:
- 预处理,涉及宏观和#包括扩展。
- 编译,将源代码转换为二进制代码并生成中间对象文件。
- 将单个ELF或EXE文件中的目标文件链接起来。
无论哪里有#include
或宏,预处理器都会将该表达式与实际值进行扩展。在#include
的情况下,整行被替换为.h文件内容。
实际的编译器(通常)不知道任何头文件,它将编译单元视为一个大的.c或.cpp文件。
“通常”部分来自于某些编译器通过在某种缓存中存储预编译头来优化头包含的事实,但效果是相同的。
相关问题
- 1. 如何在C++中编译编译器?
- 2. 在一个elf文件中,如何找到变量定义的编译单元?
- 3. C++未定义编译
- 4. 结构的编译定义如何在C中看起来像?
- 5. 编译器如何检测跨翻译单元的重复定义
- 6. 如何在xcode8中编写自定义collectionView单元的单元测试代码
- 7. 如何在C中编译C程序?
- 8. 如何在Eclipse中将我的项目从多个编译单元转换为单个编译单元
- 9. 模板类在C++中以不同编译单元编译多次?
- 10. 静态编译自定义元素
- 11. 使用ANTLR构建自己的C#编译器:编译单元
- 12. 单在C++编译错误
- 13. C++中的单独编译
- 14. C++类定义编译问题
- 15. emacs自定义C++编译支持
- 16. 编译自定义GTK + Widget为C++
- 17. 编译自定义C++包装sqlite3
- 18. 编译C:未定义的引用'memcpy'
- 19. 如何在C++中编译glib - 在编译时编译错误.cpp
- 20. Eixir元编程 - 在宏内编译时定义宏
- 21. 如何在Coffeescript中连续编译/单元测试?
- 22. C编译器如何处理不同的主函数定义?
- 23. 如何在GCC中编译Objective C++?
- 24. 如何在QT Creator中编译OpenCL C++
- 25. 如何在C中停止预编译?
- 26. 如何在原子中编译C++ 11
- 27. 如何从VCL重新编译特定单元?
- 28. C/C++编译器如何找到头文件中原型的定义?
- 29. 当源代码中存在未定义的函数时,C++如何编译?
- 30. 如何让MS C++编译器识别未在#include中定义的类型?
可能的重复:http://stackoverflow.com/questions/1106149/what-is-a-translation-unit-in-c – Flexo 2011-02-14 12:44:46
从技术上来说是重复的,但假设你知道“编译单元”是与“翻译单位”相同。 – MSalters 2011-02-14 12:55:26