'Constexpr' 对比 'extern const'。哪个优先?

'Constexpr' vs 'extern const'. Which has priority?

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

我遇到这样的情况:

文件(header 和源文件)仅包含此类定义和声明。

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

// this is in the header file. There is no cpp file any more.
constexpr int MAX_NUMBER_OF_ROWS= 99;

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

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

const int MAX_NUMBER_OF_ROWS= 99;

constexpr int MAX_NUMBER_OF_ROWS= 99;

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

如果您的编译器支持,constexpr 会更好。

它在编译时评估函数或变量的值,具有更好的性能(更少的内存查找和读取)和更少的内存消耗(不存在于数据部分)。

但是有些编译器不支持它,例如,visual studio 2013 或更早版本。

extern const 如果您计划在将来将该变量初始化为不同的值,并且不希望重新编译使用该变量的代码,则可以使用。 (我从来没有见过这种需要,但在某些情况下它可能会有用。)正如其他人所说,这个变量的值不能用于常量表达式。

constexpr 可以在编译时知道变量的值时使用。