Операторы #define в пространстве имен
Если у меня есть оператор #define в пространстве имен как таковой:
namespace MyNamespace
{
#define SOME_VALUE 0xDEADBABE
}
Правильно ли я говорю, что оператор #define не ограничивается пространством имен?
Является ли следующая "правильная" вещь?
namespace MyNamespace
{
const unsigned int SOME_VALUE = 0xDEADBABE;
}
Ответы
Ответ 1
Правильно, #define
не связаны пространствами имен. #define
является директивой preprocessor - это приводит к манипуляции исходным файлом перед компиляцией с помощью компилятора. Пространства имен используются во время этапа компиляции, и компилятор не имеет представления о #define
.
Вы должны стараться избегать препроцессора как можно больше. Для постоянных значений, подобных этому, предпочитайте const над #define
.
Ответ 2
Я полностью согласен с предложениями об использовании констант и неограниченностью области для #define
s.
Однако, если вы do должны использовать строки препроцессора #define
, пожалуйста, приложите их правильно для ожидаемой области действия,
namespace MyNamespace
{
#define SOME_VALUE 0xDEADBABE
// your code
#undef SOME_VALUE
}
Почему #defines
?
Я знаю один случай, когда встроенная платформа не поддерживала константы в коде.
Не было никакого способа их инициализировать...
Это всегда помогает быть более читаемым.
Ответ 3
Препроцессор работает (концептуально, по крайней мере, и часто на самом деле тоже) до того, как пространства имен и другие понятия уровня языка "ударят" - так да, это определенно намного лучше использовать языковые конструкции например const
значения, где вы можете!
Ответ 4
Да. В общем случае использование значений const вместо значений # define'd имеет много преимуществ. Ограничение объема переменной является одним из преимуществ. Область может быть ограничена пространством имен или любой другой допустимой областью действия (в том числе на уровне класса, уровне функции и т.д.).
Ответ 5
Если по какой-то причине вы не можете перейти во второй случай, я уверен, что вам придется позаботиться о том, чтобы скомпилировать MyNamespace в свой собственный объект и связать объекты отдельно (или, возможно, просто запустить препроцессор на это одно пространство имен). Препроцессор С++ должен принять этот оператор #define
и, по существу, заменить строку где-нибудь, где SOME_VALUE
отображается в исходном коде. Следовательно, если препроцессор не знает о #define
, SOME_VALUE
не может быть заменен в другом исходном файле.