C ++ - помещать константные магические числа в пространство имен или нет - PullRequest
0 голосов
/ 20 сентября 2018

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

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

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

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

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

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

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

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

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

...