2016-08-11 14 views
2

Когда следует использовать constexpr и когда использовать extern const?«Constexpr» против «extern const». Что имеет приоритет?

У меня есть ситуация, как:

  • в заголовке (.h):

    extern const int MAX_NUMBER_OF_ROWS; 
    
  • в источнике (.cpp):

    const int MAX_NUMBER_OF_ROWS= 99; 
    

файлы (заголовок и источник) содержат только такие определения и declarat ионов.

ли Рекоммендуемый использовать только в constexpr в файле заголовка и избавиться от исходного файла, как здесь ?:

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

они ортогональны - вы всегда могли использовать 'const int MAX_NUMBER_OF_ROWS = 99;' в заголовке; и тогда вопрос будет заключаться в том, следует ли изменить 'const' на' constexpr'. Имея его так, как вы это делаете, обычно делается только в том случае, если значение не известно во время включения заголовка. –

+0

ОК, и если он находится в заголовке, как вы сказали, может ли он быть 'constexpr', правильно? – mtb

ответ

11

Использование extern const в заголовочном файле только сообщает компилятору, что существует переменная и что он не модифицируется. Он не говорит компилятору о его значении, что означает, что он больше не является константой времени компиляции. Если это не константа времени компиляции, она не может использоваться, например, case или как размер массива.

Как сказал ММ в комментарии, либо использовать

const int MAX_NUMBER_OF_ROWS= 99; 

или

constexpr int MAX_NUMBER_OF_ROWS= 99; 

непосредственно в файле заголовка, и это будет время компиляции постоянной во всех единицах трансляции, которые включают файл заголовка.

+0

Вопрос в том, когда использовать 'const int' и когда' constexpr int' в файле заголовка? – mtb

+0

В C вы получаете ошибки связывания, если в заголовке вы просто используете 'const int MAX_NUMBER_OF_ROWS = 99;' и включаете его в несколько исходных файлов. Разве это отличается от C++, или это отсутствует в вашем ответе? – user694733

+3

@ user694733 Да, это отличается от C++; переменные 'const' имеют внутреннюю связь, если не объявлены с помощью' extern' (в определении или в предыдущем объявлении той же переменной) –

3

constexpr лучше, если ваш компилятор поддерживает его.

Он оценивает значение функции или переменной во время компиляции с лучшей производительностью (меньше памяти и чтения) и меньше затрат на память (не существует в разделе данных).

Однако некоторые компиляторы не поддерживают его, например, визуальную студию 2013 года и старше.

3

extern const можно использовать, если вы планируете инициализировать переменную в другом значении в будущем и не хотите перекомпилировать коды, которые используют эту переменную. (Я никогда не видел этой необходимости, но в некоторых случаях это может быть полезно.) Как уже говорили другие, значение этой переменной не может использоваться в постоянных выражениях.

constexpr может использоваться, когда значение переменной известно во время компиляции.

+0

хорошим примером является строка версии. если u использовать cmake для записи текущей версии git в программу, она будет меняться все время, поэтому не хочу в заголовке –