Now*_*ero 2 c linker compilation header
我的理解是,在链接时,如果使用“extern”关键字声明符号,那么编译器不会抱怨缺少其定义。此外,链接器不会有任何问题,因为它首先会创建符号表,然后会检测正确的源代码并填充其定义。
似乎在构建一个由多个文件组成的没有头文件的程序时根本没有问题 - 如果一个文件中缺少的所有符号都用“extern”很好地声明了。
如果使用“extern”关键字可以检测到其他文件的符号识别,那么为什么还要有“头”文件呢?
我的理解是,在链接时,如果使用“extern”关键字声明符号,那么编译器不会抱怨缺少其定义。
C 中的关键字extern告诉编译器它所在的声明描述了标识符,但没有定义它们。1这是编译时效果,而不是链接时发生的情况。
如果使用“extern”关键字可以检测到其他文件的符号识别,那么为什么还要有“头”文件呢?
将声明放入头文件中允许我们将它们包含在多个源文件中,而无需重新键入或复制和粘贴它们。这可以避免输入错误,并有助于确保整个程序中的标识符使用相同的声明。此外,最好将声明标识符的头文件包含在定义标识符的源文件中,以便编译器在同一编译中看到声明和定义,并在它们不一致时发出警告。
另一个原因是头文件被认为是相关源文件的作者发布的东西,用于告诉其他程序员源文件提供什么。在程序员可以extern在自己的源文件中编写自己的声明之前,必须有人告诉他们这些声明是什么。编写源文件 NiftyLibrary.c 的人可以(并且应该)编写一份手册,列出所有函数的声明(以及这些函数的作用),然后任何使用 NiftyLibrary.c 的人都可以阅读该手册并将必要的声明键入到他们的文件中。程序。但如果库作者提供 NiftyLibrary.h 并且其他程序员仅包含标头而不是重新输入所有内容,那就更容易了。
1这是 的功能之一extern。由于 C 的发展历史,完整的语义很复杂。