Я всегда использовал #define
определить магические числа где-нибудь в начале файла cpp. Я хочу изменить это на const
номера. (Глобальные переменные объявлены / определены в файле cpp.) Это хорошая идея? Должен ли я поместить их в анонимное пространство имен? я никогда #include
файлы cpp в любом месте.
В основном единственная причина, по которой вы выбираете такую #define
«consts» — это если сам препроцессор должен будет их использовать. Помимо этого, у вас есть целая куча преимуществ для constexpr
над использованием таких #define
с — они перечисленные здесь.
Анонимное пространство имен являются хорошим решением, только если вы собираетесь использовать магические числа в том же файле, поскольку имена внутри него никогда не доступны из других модулей перевода, потому что безымянное пространство имен имеет уникальный идентификатор, что касается компилятора. Тем не менее, здесь нет никакой реальной выгоды в магические числа внутри анонимное пространство имен, как либо 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
Должен ли я поместить их в анонимное пространство имен?
Если используется в области видимости файла, да, это имеет смысл.