'Constexpr'与'extern const'.哪个有优先权?

mtb*_*mtb 2 c++ const extern constexpr c++11

何时使用constexpr以及何时使用extern const

我有这样的情况:

文件(标题和源)仅包含此类定义和声明.

是否建议只使用constexpr头文件并删除源文件,就像在这里一样?:

// this is in the header file. There is no cpp file any more.
constexpr int MAX_NUMBER_OF_ROWS= 99;
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 12

使用extern const头文件只告诉了变量存在的编译器,它是不可修改的.它不会告诉编译器它的值,这意味着它不再是编译时常量.如果它不是编译时常量,那么它不能用于例如case或数组大小.

正如MM在评论中所说,要么使用

const int MAX_NUMBER_OF_ROWS= 99;
Run Code Online (Sandbox Code Playgroud)

要么

constexpr int MAX_NUMBER_OF_ROWS= 99;
Run Code Online (Sandbox Code Playgroud)

直接在头文件中,它将是包含头文件的所有翻译单元中的编译时常量.

  • @ user694733是的,它在C++中是不同的; `const`变量有内部链接,除非用`extern`声明(在定义中,或在同一变量的先前声明中) (3认同)
  • @mtb这更像是个人偏好的问题而不是其他任何事情.唯一不是,如果您的目标是不支持C++ 11的旧编译器. (2认同)
  • 在C++中> = 17`constexpr`生成一个变量`constexpr inline`,摆脱了ODR问题. (2认同)