【发布时间】:2017-07-18 07:44:15
【问题描述】:
我在许多 C++ 代码库中看到了一个共同的模式:
Header.h:
static const int myConstant = 1;
Source1.cpp:
#include "Header.h"
Source2.cpp:
#include "Header.h"
基于:
3.5 程序及联动
...
(2.1) — 当名称具有外部链接时,它所表示的实体可以由范围内的名称引用 其他翻译单元或来自同一翻译单元的其他范围。
(2.2) — 当名称具有内部链接时,它所表示的实体可以由其他范围的名称引用 在同一个翻译单元中。
...
3 具有命名空间范围 (3.3.6) 的名称如果是以下名称,则具有内部链接
(3.1) — 显式声明为静态的变量、函数或函数模板;或者,
myConstant 只能从同一个翻译单元访问,编译器将生成它的多个实例,每个包含Header.h 的翻译单元一个。
我的理解是否正确 - 创建了多个 myConstant 实例?如果是这种情况,请您指出在 C++ 中使用常量的更好选择
编辑:
有人建议在标题中创建myConstant extern 并将其定义在一个cpp 文件中。这是一个好习惯吗?我猜这会使编译器看不到该值并阻止许多优化,例如当该值出现在算术运算中时。
【问题讨论】:
-
如何标记它
constexpr?编译器可能会优化它。 -
为什么不为此使用预处理器#define?
-
@Veda 这被认为是一种不好的做法。反之亦然。尽可能使用
const代替#define。 -
const变量在 C++ 中始终被视为常量表达式,除非它们的 odr 用途需要另外使用(例如获取它们的地址)。如果您仅将它们用作真正的常量,则甚至不需要static限定符。
标签: c++