在 C++11 标准中,在头文件中定义的 constexpr
和 static constexpr
全局变量有什么区别?更具体地说,当多个翻译单元包含相同的标头时,哪个声明(如果有)可以保证在翻译单元中定义相同的变量?
例如,
cexpr.h:
#ifndef CEXPR_H
#define CEXPR_H
constexpr int cint = 1;
static constexpr int scint = 1;
#endif
一个.cpp:
#include "cexpr.h"
b.cpp:
#include "cexpr.h"
原文由 Danra 发布,翻译遵循 CC BY-SA 4.0 许可协议
在您当前的示例中没有区别:在变量声明中,
constexpr
意味着const
,并且命名空间范围内的 const 变量默认具有内部链接(因此添加static
不会改变任何东西)。在 C++14 中,您不能将变量声明为
constexpr
并使其具有外部链接,除非您只在一个翻译单元中这样做。原因是constexpr
变量需要一个初始化器,带有初始化器的声明是一个定义,你必须只有一个定义。但是,您 可以 做的是使用普通的整数常量,您可以将其声明(未定义)为
extern
,并且在定义它的翻译单元中,它甚至可以用作常量表达式:lib.h:
lib.cpp:
在 C++17 中,有一个新功能“内联变量”可以让你说:
这是一个可以重复出现的“内联定义”,每个定义都定义了 同一个 实体(就像语言中所有其他的“内联”实体一样)。