【问题标题】:#define statements within a namespace#define 命名空间中的语句
【发布时间】:2010-11-08 11:11:27
【问题描述】:

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

namespace MyNamespace
{
  #define SOME_VALUE 0xDEADBABE
}

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

以下是“正确”的做法吗?

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

【问题讨论】:

    标签: c++ namespaces


    【解决方案1】:

    正确,#define 不受命名空间的约束。 #define 是一个 preprocessor 指令 - 它导致在通过编译器编译之前对源文件进行操作。命名空间在编译步骤中使用,编译器无法洞察#define

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

    【讨论】:

    • constexpr 更合适地等效于#define 的常量值表达式
    【解决方案2】:

    我完全同意#defines 使用常量和范围不受限制的建议。

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

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

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

    【讨论】:

      【解决方案3】:

      预处理器在命名空间和其他语言级概念“启动”之前运行(至少在概念上,而且通常也是如此)——所以是的,它肯定 很多最好尽可能使用语言级别的构造,例如 const 值!

      【讨论】:

        【解决方案4】:

        是的。一般来说,使用 const 值而不是 #define'd 值有很多优点。限制变量的范围是优点之一。范围可以限制为命名空间,或以这种方式限制在任何其他有效范围内(包括类级别、函数级别等)。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

          • “如果由于某种原因,您无法更改为第二种情况”?我赶不上。第二种情况是什么?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-03
          • 2013-11-23
          • 2010-10-22
          • 2013-08-17
          • 2015-12-16
          相关资源
          最近更新 更多