何时使用constexpr
以及何时使用extern const
?
我的情况如下:
:
extern const int MAX_NUMBER_OF_ROWS;
:
const int MAX_NUMBER_OF_ROWS= 99;
文件(标题和来源)仅包含此类定义和声明。
是否建议只使用头文件中的constexpr
并删除源文件,就像在这里一样?:
// this is in the header file. There is no cpp file any more.
constexpr int MAX_NUMBER_OF_ROWS= 99;
答案 0 :(得分:11)
在头文件中使用extern const
只告诉编译器该变量存在且不可修改。它不会告诉编译器它的值,这意味着它不再是编译时常量。如果它不是编译时常量,则它不能用于例如case
或数组大小。
如M.M在评论中所述,要么使用
const int MAX_NUMBER_OF_ROWS= 99;
或
constexpr int MAX_NUMBER_OF_ROWS= 99;
直接在头文件中,它将是包含头文件的所有翻译单元中的编译时常量。
答案 1 :(得分:3)
如果您的编译器支持,那么constexpr会更好。
它在编译时评估函数或变量的值,具有更好的性能(更少的内存查找和读取)和更少的内存成本(数据部分中不存在)。
然而,有些编译器并不支持它,例如2013年或更早的visual studio。
答案 2 :(得分:3)
extern const
。 (我从未见过这种需要,但在某些情况下可能会有用。)正如其他人所说,这个变量的值不能用在常量表达式中。
constexpr
。