Подтвердить что ты не робот

Операторы #define в пространстве имен

Если у меня есть оператор #define в пространстве имен как таковой:

namespace MyNamespace
{
  #define SOME_VALUE 0xDEADBABE
}

Правильно ли я говорю, что оператор #define не ограничивается пространством имен?

Является ли следующая "правильная" вещь?

namespace MyNamespace
{
  const unsigned int SOME_VALUE = 0xDEADBABE;
}
4b9b3361

Ответ 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 не может быть заменен в другом исходном файле.