命名空间中的#define语句

时间:2009-07-06 17:40:44

标签: c++ namespaces

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

namespace MyNamespace
{
  #define SOME_VALUE 0xDEADBABE
}

我说#define语句不限于命名空间吗?

以下是“正确”的事情吗?

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

5 个答案:

答案 0 :(得分:60)

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

您应尽量避免使用预处理器。对于像这样的常量值,更喜欢const而不是#define

答案 1 :(得分:20)

我完全同意有关使用常量的建议,并且#define s的范围无限制。

但是,如果你必须使用预处理器#define行,请在预期范围内正确覆盖它们,

namespace MyNamespace
{
  #define SOME_VALUE 0xDEADBABE
  // your code
  #undef SOME_VALUE
}

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

答案 2 :(得分:4)

预处理器在名称空间和其他语言级概念“启动”之前(概念上至少,实际上也经常)运行 - 所以是的, 最好在任何地方使用const值等语言级构造!

答案 3 :(得分:3)

是。通常,使用const值而不是#defined'd值具有许多优点。限制变量的范围是其中一个优点。范围可以限制为命名空间,也可以限制在任何其他有效范围内(包括在类级别,功能级别等)。

答案 4 :(得分:0)

如果由于某种原因,你无法改为第二种情况,我很确定你必须小心将MyNamespace编译成它自己的对象并单独链接这些对象(或者可能只是运行预处理器)单个命名空间本身)。 C ++预处理器应该采用#define语句,并且基本上执行字符串替换在源代码中看到SOME_VALUE。因此,如果预处理器不知道#define,则SOME_VALUE无法替换为另一个源文件。