命名空间中的#define语句

Soo*_*Tan 50 c++ namespaces

如果我在命名空间中有#define语句:

namespace MyNamespace
{
  #define SOME_VALUE 0xDEADBABE
}
Run Code Online (Sandbox Code Playgroud)

我是否正确地说#define语句不限于名称空间?

以下是"正确"的事情吗?

namespace MyNamespace
{
  const unsigned int SOME_VALUE = 0xDEADBABE;
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*ael 65

正确,#define不受名称空间的约束. #define是一个预处理器指令 - 它导致在通过编译器编译之前操纵源文件.在编译步骤中使用命名空间,编译器无法深入了解#define.

您应该尽可能地避免使用预处理器.对于像这样的常量值,更喜欢const over #define.

  • constexpr 更适合等同于 #define 的常量值表达式 (3认同)

nik*_*nik 21

我完全同意有关使用常量的建议,并且范围对于#defines 是无限制的.

但是,如果必须使用预处理#define线,请正确地掩盖起来了预期的范围内,

namespace MyNamespace
{
  #define SOME_VALUE 0xDEADBABE
  // your code
  #undef SOME_VALUE
}
Run Code Online (Sandbox Code Playgroud)

为什么#defines
我知道一个嵌入式平台不支持代码中的常量的情况.
没有办法初始化它们......
总是有助于提高可读性.


Ale*_*lli 5

预处理器在命名空间和其他语言级概念“启动”之前运行(至少在概念上,而且通常也是如此) - 所以是的,在任何地方使用语言级构造(例如值)肯定 好得多const