C++ - помещать константные магические числа в пространство имен или нет

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

2 ответа

Решение

В основном единственная причина, по которой вы выбираете такую #define "consts" - это если сам препроцессор должен будет их использовать. Помимо этого, у вас есть целая куча преимуществ для constexpr над использованием таких #defines - они перечислены здесь.

Анонимное пространство имен является хорошим решением, только если вы собираетесь использовать магические числа в том же файле, так как имена внутри него никогда не доступны из других модулей перевода, потому что безымянное пространство имен имеет уникальный идентификатор, поскольку это касается компилятора. Тем не менее, здесь нет никакой реальной выгоды в помещении магических чисел в анонимное пространство имен, как либо 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

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

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

Другие вопросы по тегам