命名空间中的#define语句

如果我在命名空间中有一个#define语句,

namespace MyNamespace { #define SOME_VALUE 0xDEADBABE } 

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

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

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

正确的#define不受命名空间的限制。 #define是一个预处理器指令,它会在编译器编译之前处理源文件。 命名空间在编译步骤中使用,编译器没有洞察#define的。

你应该尽量避免预处理器。 对于像这样的常量值,更喜欢const在#define

我完全同意使用常量的build议,并且对#define s的范围是无限的。

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

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

为什么#defines
我知道一个embedded式平台不支持代码中的常量的情况。
没有办法初始化他们…
它总是有助于更可读。

预处理器在命名空间和其他语言层次的概念“踢入”之前(至less在概念上是操作的,至less在概念上是这样) – 所以是的,在任何地方使用const值等语言级结构肯定 更好。

是。 一般来说,使用const值而不是#define的值有很多优点。 限制variables的范围是其中一个优点。 作用域可以被限制在一个命名空间,也可以被限制在任何其他有效作用域(包括在类级别,function级别等)。

如果由于某种原因,你不能改变到第二种情况,我敢肯定,你将不得不小心将MyNamespace编译成它自己的对象,并单独链接对象(或者可能只是在单个命名空间上运行预处理器通过它自己)。 C ++预处理器应该使用#define语句,并且在源代码中可以看到SOME_VALUE 任何地方 SOME_VALUEreplaceSOME_VALUEstring。 因此,如果预处理程序不知道#define ,则不能在另一个源文件中replaceSOME_VALUE