我应该在常量的定义中添加关键字 extern 以在源文件之间共享吗?
Should I add keyword `extern` to the definition of a constant to share among source files?
在第 95 页的 "C++ Primer, Fifth Edition" 中。谈论常量。他说:
Sometimes we have a const
variable that we want to share across multiple files but whose initializer is not a constant expression. In this case, we don’t want the compiler to generate a separate variable in each file. Instead, we want the const
object to behave like other (non const
) variables. We want to define the const
in one file, and declare it in the other files that use that object.
To define a single instance of a const
variable, we use the keyword extern
on both its definition and declaration(s):
// file_1.cc
defines and initializes a const
that is accessible to other files.
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 - 一个定义规则。这是您目前拥有的:
extern const int bufSize = fcn();
这是一个有效的定义,因为任何带有外部存储 class 和初始值设定项的声明都是一个定义。然而,
const int bufSize = fcn();
也是一个定义。并且通过前面的 extern
声明,这个定义有一个外部链接——这意味着,它可以从其他翻译单元访问(没有那个,命名空间范围内的 const int bufSize
将有内部链接)。
底线 - 示例中的 extern
不会影响编译器行为,但会提醒正在阅读代码的人该变量具有外部链接(因为从这一行看并不明显)。
延伸阅读:
在第 95 页的 "C++ Primer, Fifth Edition" 中。谈论常量。他说:
Sometimes we have a
const
variable that we want to share across multiple files but whose initializer is not a constant expression. In this case, we don’t want the compiler to generate a separate variable in each file. Instead, we want theconst
object to behave like other (nonconst
) variables. We want to define theconst
in one file, and declare it in the other files that use that object.To define a single instance of a
const
variable, we use the keywordextern
on both its definition and declaration(s):
// file_1.cc
defines and initializes aconst
that is accessible to other files.
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 - 一个定义规则。这是您目前拥有的:
extern const int bufSize = fcn();
这是一个有效的定义,因为任何带有外部存储 class 和初始值设定项的声明都是一个定义。然而,
const int bufSize = fcn();
也是一个定义。并且通过前面的 extern
声明,这个定义有一个外部链接——这意味着,它可以从其他翻译单元访问(没有那个,命名空间范围内的 const int bufSize
将有内部链接)。
底线 - 示例中的 extern
不会影响编译器行为,但会提醒正在阅读代码的人该变量具有外部链接(因为从这一行看并不明显)。
延伸阅读: