Лучший способ определить константную переменную - PullRequest
0 голосов
/ 03 июля 2018

Я пишу на C ++ и хочу узнать, как лучше определить переменную const.

Насколько я понимаю, если я хочу определить константную переменную в файле cpp, мы могли бы написать код раньше: const static int LEN = 5; А теперь C ++ предлагает нам использовать анонимное пространство имен: namespace { const int LEN = 5; }

Я не знаю, как правильно определить переменную const в заголовочном файле.

Я видел несколько кодов в некоторых заголовочных файлах, как показано ниже:

const int LEN = 5;

Так это лучший способ? Почему бы нам не кодировать const static int LEN = 5; в заголовочном файле?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Я пишу на C ++ и хочу узнать, как лучше определить переменную const.

Нет «лучшего пути». Это зависит.

Кстати, когда-нибудь слышали о constexpr?

Насколько я понимаю, если я хочу определить константную переменную в файле cpp, мы можем кодировать так до: const static int LEN = 5;

Да, мы можем.

Обратите внимание, что вещи в области имен, объявленные с ключевым словом static, имеют внутреннюю связь .

Также обратите внимание, что я не называю LEN "статической переменной".

И теперь C ++ предлагает нам использовать анонимное пространство имен: namespace { const int LEN = 5; }

Все, что объявлено в анонимном пространстве имен, имеет внутреннюю связь . Но я не думаю, что сам C ++ делает какие-либо предложения.

Я видел несколько кодов в некоторых заголовочных файлах, как показано ниже:

const int LEN = 5;

В C ++ есть специальное условие, согласно которому переменные, определенные в пространстве имен, имеют константные переменные в области имен, по умолчанию имеют внутреннюю связь , даже без спецификатора static.

См .: https://en.cppreference.com/w/cpp/language/storage_duration#Linkage

Обратите внимание, что он отличается от C.

Также обратите внимание, что это не означает "const включает static". Мышление таким образом сбивает с толку.

Почему бы нам не кодировать const static int LEN = 5; в заголовочном файле?

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

0 голосов
/ 03 июля 2018

1. Определенная переменная в заголовке может вызвать множественное определение, если заголовок включен в несколько файлов CPP.

2. Классификатор Stat сделает переменную const "локальной", поэтому при #include ".h" создается новый экземпляр. namespace {} делает то же самое.

3. Как сказал @Ant, const уже содержит статический в C ++, поэтому не возникает многократной ошибки определения.

...