constexpr 和静态 constexpr 全局变量的区别

新手上路,请多包涵

在 C++11 标准中,在头文件中定义的 constexprstatic 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 许可协议

阅读 1.5k
1 个回答

在您当前的示例中没有区别:在变量声明中, constexpr 意味着 const ,并且命名空间范围内的 const 变量默认具有内部链接(因此添加 static 不会改变任何东西)。

在 C++14 中,您不能将变量声明为 constexpr 并使其具有外部链接,除非您只在一个翻译单元中这样做。原因是 constexpr 变量需要一个初始化器,带有初始化器的声明是一个定义,你必须只有一个定义。

但是,您 可以 做的是使用普通的整数常量,您可以将其声明(未定义)为 extern ,并且在定义它的翻译单元中,它甚至可以用作常量表达式:

lib.h:

 extern const int a;

lib.cpp:

 #include "lib.h"

const int a = 10;

int b[a] = {1, 2, 3};   // OK in this translation unit

在 C++17 中,有一个新功能“内联变量”可以让你说:

 inline constexpr int a = 10;

这是一个可以重复出现的“内联定义”,每个定义都定义了 同一个 实体(就像语言中所有其他的“内联”实体一样)。

原文由 Kerrek SB 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏