我有2个文件,一个包含全局const变量,另一个包含变量的外部定义,当我单独编译文件并将文件链接在一起时,这是否有效?
/* File 1 */
const int itest;
/* File 2 */
extern const int itest = 123;
在一个源文件中定义变量并使其在其他源文件中按名称可用的正确方法是在一个源文件中定义它:
const int itest = 123; // "extern" is optional and is traditionally omitted in a definition.
并在任何使用它的源文件中声明它:
extern const int itest; // "extern" should be used here.
一般做法是将上述声明放在头文件中,并将该头文件包含在使用该变量的任何文件中,包括定义该变量的文件。重用头文件中的一个声明有助于避免在重新输入、粘贴或编辑时出现错误。在源文件中包含定义变量的头文件允许编译器在同一编译过程中看到它们并检查它们的一致性。
由于与C语言开发和使用历史相关的原因,没有extern
或初始化式的const int itest;
是一种特殊的东西,称为暂定定义。这不是一个定义,但实际上可以创建一个定义。一些构建工具特别对待由暂定定义创建的定义,允许它们与其他定义合并。这意味着在一个源文件中使用const int itest;
和extern const int itest = 123;
可能会或可能不会生成链接器错误,这取决于所使用的构建工具和与它们一起使用的开关。您通常不需要此功能,应避免临时定义。
这两个声明都带有外部链接
const int itest;
和
extern const int itest = 123;
是定义(第一个是暂定定义;该常量初始化为0)。因此,具有外部链接的相同名称的对象itest
被定义了两次。
你应该写在一个文件
const int itest = 123;
和另一个文件
extern const int itest;
最后一个是声明,但不是定义,因为没有初始化式。
另一方面,您可以使用内部链接声明常量,并将其声明放在像 这样的头文件中。static const int itest = 123;