我应该在源文件之间共享的常量的定义中添加关键字"extern"吗

Should I add keyword `extern` to the definition of a constant to share among source files?

本文关键字:quot 关键字 extern 添加 定义 源文件 之间 共享 我应该 常量      更新时间:2023-10-16

见"C++初级读本,第五版",第95页。谈论常量。他说:

有时我们有一个const变量,我们希望在多个文件中共享,但其初始值设定项不是常量表达式。在这种情况下,我们不希望编译器在每个文件中生成一个单独的变量。相反,我们希望const对象的行为与其他(非const)变量类似。我们希望在一个文件中定义const,并在使用该对象的其他文件中声明它。

要定义const变量的单个实例,我们在其定义和声明中都使用关键字extern

// file_1.cc定义并初始化其他文件可访问的const

extern const int bufSize = fcn();

// file_1.h

extern const int bufSize; // same bufSize as defined in file_1.cc

我不确定的是最后一段;我从bufsize的定义中删除了extern,但它可以从其他文件访问?!

const int bufSize = fcn(); // without keyword extern

为什么他说我们应该在声明和bufsize的定义中都添加关键字extern,以便从其他文件访问,但我认为extern在声明中就足够了?

谢谢你的帮助。

您认为cpp文件中不需要extern是正确的。

首先,您需要了解什么是声明和定义。bufSize需要在使用的每个翻译单元中都有一个声明,并且在程序中有一个定义。让我们看看你在.h文件中有什么:

extern const int bufSize;

这是const int变量的有效声明。这里没有混乱。

现在您需要一个定义,该定义将转到.cpp文件,并且您需要确保它存在于整个程序中的单个位置,否则您将破坏ODR-One定义规则。这就是你目前拥有的:

extern const int bufSize = fcn();

这是一个有效的定义,因为任何带有外部存储类和初始值设定项的声明都是一个定义。然而,

const int bufSize = fcn();

还有一个定义。由于前面声明了extern,这个定义有一个外部链接,这意味着它可以从其他翻译单元访问(如果没有它,名称空间范围中的const int bufSize将有内部链接)。

最重要的一点是,示例中的extern不会影响编译器行为,但会提醒正在阅读代码的人,该变量具有外部链接(因为从这一行中看并不明显)。

进一步阅读:

https://en.cppreference.com/w/cpp/language/definition

https://en.cppreference.com/w/cpp/language/storage_duration