【问题标题】:C++ macros and namespacesC++ 宏和命名空间
【发布时间】:2013-02-21 12:42:40
【问题描述】:

我在命名空间中使用宏时遇到了问题。 代码是

#include <iostream>

namespace a
{
#define MESSAGE_A(message) \
    std::cout << (message) << std::endl;
}

#define MESSAGE_A(message) \
    std::cout << (message) << std::endl;

int main()
{
    //works fine
    MESSAGE_A("Test");
    //invalid
    a::MESSAGE_A("Test")
    return 0;
}

在宏中使用命名空间对象的正确变体是什么。

【问题讨论】:

    标签: c++ macros namespaces


    【解决方案1】:

    宏由预处理器处理,它对命名空间一无所知。 所以宏没有命名空间,它们只是文本替换。确实不鼓励使用宏,其中一个原因是它们总是污染全局命名空间。

    如果您需要打印一条消息,并且需要将其命名为命名空间,只需使用内联函数即可。代码看起来很简单,可以正确内联:

    namespace a
    {
      inline void MESSAGE_A(const char* message) 
      {
        std::cout << message << std::endl;
      }
    }
    

    【讨论】:

      【解决方案2】:

      它不会起作用。 Macroses 对命名空间一无所知。如果你想使用命名空间 - 你不能使用宏。

      【讨论】:

      • 可以帮助解决解决方案。在我的项目中,我必须在命名空间中使用宏,并且它们必须从另一个命名空间调用宏。
      • @MaxFX,宏没有被“调用”,它们被替换了。如果您需要将宏用于过于复杂的事情,那您就做错了。
      猜你喜欢
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 2015-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      相关资源
      最近更新 更多