C++ C++;宏和名称空间

C++ C++;宏和名称空间,c++,macros,namespaces,C++,Macros,Namespaces,我在名称空间中使用宏时遇到问题。 代码是 #include <iostream> namespace a { #define MESSAGE_A(message) \ std::cout << (message) << std::endl; } #define MESSAGE_A(message) \ std::cout << (message) << std::endl; int main() { //w

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

#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;
}
#包括
名称空间a
{
#定义消息(消息)\

std::cout它将不起作用。宏对名称空间一无所知。如果要使用名称空间,则不能使用宏。

宏由预处理器处理,预处理器对名称空间一无所知。 因此,宏没有名称空间,它们只是文本替换。使用宏确实是不受鼓励的,因为它们总是污染全局名称空间

如果您需要打印消息,并且需要将其命名为命名空间,只需使用内联函数即可。代码似乎足够简单,可以正确内联:

namespace a
{
  inline void MESSAGE_A(const char* message) 
  {
    std::cout << message << std::endl;
  }
}
名称空间a
{
内联无效消息(常量字符*消息)
{

std::cout可以帮助解决问题。在我的项目中,我必须在命名空间中使用宏,它们必须从另一个命名空间调用宏。@MaxFX,宏不是“调用”的,而是被替换的。如果你需要在过于复杂的事情上使用宏,那你就做错了。