首页 > 解决方案 > C 使用 extern 定义全局常量

问题描述

我有 2 个文件,一个包含全局 const 变量,另一个包含变量的外部定义,当我单独编译文件并将文件链接在一起时,这是否有效?

/* File 1 */
const int itest;
/* File 2 */
extern const int itest = 123;

标签: cdeclarationdefinitionexternlinkage

解决方案


在一个源文件中定义变量并使其在其他源文件中可用的正确方法是在一个源文件中定义它:

const int itest = 123;  // "extern" is optional and is traditionally omitted in a definition.

并在任何使用它的源文件中声明它:

extern const int itest; // "extern" should be used here.

一般的做法是将上述声明放在头文件中,并将该头文件包含在任何使用该变量的文件中,包括定义它的文件。重用头文件中的一个声明有助于避免重新键入、粘贴或编辑中的错误。在定义变量的源文件中包含头文件允许编译器在同一编译期间查看两者并检查它们的一致性。

由于与 C 开发和使用历史相关的原因,const int itest;没有extern或没有初始化程序是一种特殊的东西,称为暂定定义。这不是定义,但实际上可以导致创建定义。一些构建工具专门处理由暂定定义创建的定义,允许它们与其他定义合并。这意味着const int itest;在一个源文件中extern const int itest = 123;可能会或可能不会生成链接器错误,具体取决于使用的构建工具和与它们一起使用的开关。你通常不想要这个特性,应该避免试探性的定义。


推荐阅读