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

时间:2016-08-11 07:48:24

标签: c++ c++11 const extern constexpr

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

我的情况如下:

    标题(.h)中的
  • extern const int MAX_NUMBER_OF_ROWS;
    
  • 来源(.cpp)中的
  • 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;

3 个答案:

答案 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