'Constexpr' 对比 'extern const'。哪个优先?
'Constexpr' vs 'extern const'. Which has priority?
何时使用 constexpr
以及何时使用 extern const
?
我遇到这样的情况:
在header (.h):
extern const int MAX_NUMBER_OF_ROWS;
在源 (.cpp) 中:
const int MAX_NUMBER_OF_ROWS= 99;
文件(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
可以在编译时知道变量的值时使用。
何时使用 constexpr
以及何时使用 extern const
?
我遇到这样的情况:
在header (.h):
extern const int MAX_NUMBER_OF_ROWS;
在源 (.cpp) 中:
const int MAX_NUMBER_OF_ROWS= 99;
文件(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
可以在编译时知道变量的值时使用。