我应该在源文件之间共享的常量的定义中添加关键字"extern"吗
Should I add keyword `extern` to the definition of a constant to share among source files?
见"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
- Visual Studio 2015:Extern "C" 和 "export" 关键字
- C++中的"inline"关键字
- 如何确保C++函数在定义之前声明(如override关键字)
- 谷歌模拟和覆盖关键字
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 为什么"delete"关键字不删除节点?
- 在 c++ 中正确定义"this"关键字?
- 这个额外的关键字在这个 c++ 类声明中是什么意思?
- 在 typedef 内部使用 const 关键字和在 typedef 外部使用 const 关键字之间有区别吗?
- C++ - 为什么这里需要'template'关键字?
- C++函数的关键字?
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- "friend"关键字在C++中是什么意思?
- 声明C++数组(带或不带 "new" 关键字)
- 对齐和对齐的实际用例C++关键字
- 在 c++ 中三元运算符中不允许继续(关键字)吗?
- 考虑到其他好处,关键字'auto'真的有助于简化调试C++吗?
- 在 Objective-C++ -> EXC_BAD_ACCESS Error 中使用"new"关键字