8

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

#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;
}

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

4

2 回答 2

10

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

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

namespace a
{
  inline void MESSAGE_A(const char* message) 
  {
    std::cout << message << std::endl;
  }
}
于 2013-02-21T12:45:08.147 回答
2

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

于 2013-02-21T12:44:11.097 回答