C++宏和命名空间

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

如何在宏中正确使用命名空间对象的变体。

2个回答

12
宏是由预处理器处理的,它不知道命名空间。因此,宏没有命名空间,它们只是文本替换。出于多种原因,使用宏实际上是不被鼓励的,其中之一是因为它们总是污染全局命名空间。
如果您需要打印消息,并且需要它有命名空间,请使用内联函数。代码似乎足够简单以正确地进行内联:
namespace a
{
  inline void MESSAGE_A(const char* message) 
  {
    std::cout << message << std::endl;
  }
}

3

这样行不通。宏不知道命名空间的存在。如果想要使用命名空间,就不能使用宏。


可以提供一个解决方案。在我的项目中,我必须在命名空间中使用宏,并且它们必须调用另一个命名空间中的宏。 - shadeglare
@MaxFX,宏不是“调用”,而是被替换。如果您需要使用宏来处理过于复杂的事情,那么您可能做错了什么。 - StoryTeller - Unslander Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接