如果我在命名空间中有#define语句:
namespace MyNamespace
{
#define SOME_VALUE 0xDEADBABE
}
我说#define语句不限于命名空间吗?
以下是“正确”的事情吗?
namespace MyNamespace
{
const unsigned int SOME_VALUE = 0xDEADBABE;
}
答案 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
无法替换为另一个源文件。