По сути, единственная причина, по которой вы выбираете такие #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