Поместите константные магические числа в пространство имен или нет

Я всегда использовал #define определить магические числа где-нибудь в начале файла cpp. Я хочу изменить это на const номера. (Глобальные переменные объявлены / определены в файле cpp.) Это хорошая идея? Должен ли я поместить их в анонимное пространство имен? я никогда #include файлы cpp в любом месте.

1

Решение

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

Другие решения

Это хорошая идея?

Да как #define имеет несколько проблем, например:

#define SIX 1 + 5
#define NINE 8 + 1

constexpr int the_answer = SIX * NINE; // 42 and not 54

Должен ли я поместить их в анонимное пространство имен?

Если используется в области видимости файла, да, это имеет смысл.

3

По вопросам рекламы [email protected]