C++ - помещать константные магические числа в пространство имен или нет
Я всегда использовал #define
определить магические числа где-нибудь в начале файла cpp. Я хочу изменить это на const
номера. (Глобальные переменные объявлены / определены в файле cpp.) Это хорошая идея? Должен ли я поместить их в анонимное пространство имен? я никогда #include
файлы cpp в любом месте.
2 ответа
В основном единственная причина, по которой вы выбираете такую #define
"consts" - это если сам препроцессор должен будет их использовать. Помимо этого, у вас есть целая куча преимуществ для constexpr
над использованием таких #define
s - они перечислены здесь.
Анонимное пространство имен является хорошим решением, только если вы собираетесь использовать магические числа в том же файле, так как имена внутри него никогда не доступны из других модулей перевода, потому что безымянное пространство имен имеет уникальный идентификатор, поскольку это касается компилятора. Тем не менее, здесь нет никакой реальной выгоды в помещении магических чисел в анонимное пространство имен, как либо const
или же constexpr
Переменные в любой области имен имеют внутреннюю связь.
Насколько разница между const
а также constexpr
идет в контексте объектов, суть в том, что пока constexpr
обозначает постоянное значение, известное во время компиляции, const
обозначает только постоянное значение, которое может быть неизвестно во время компиляции.1 Это различие имеет решающее значение для программирования во время компиляции или для использования в других константных выражениях.
1 Обратите внимание, что const
Интеграл, который сам по себе инициализируется константным выражением (таким как целочисленный литерал) как часть его объявления, неявно является константным выражением даже без явного объявления его constexpr
:
const int A = 50; // `A` is a constant expression
int n = 50;
const int B = n; // `B` is not a constant expression as it-
// is not being initialized with a constant expression
Это хорошая идея?
Да как #define
имеет несколько проблем, например:
#define SIX 1 + 5
#define NINE 8 + 1
constexpr int the_answer = SIX * NINE; // 42 and not 54
Должен ли я поместить их в анонимное пространство имен?
Если используется в области видимости файла, да, это имеет смысл.