2013-02-21 164 views
8

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

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

是什么在宏使用命名空间的对象适当的变型。

回答

11

宏由预处理器处理,对命名空间一无所知。 所以宏不是命名空间,它们只是文本替换。除了其他原因之外,宏的使用确实受到阻碍,因为它们总是污染全局名称空间。

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

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

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

+0

可以帮助解决方法。在我的项目中,我必须在命名空间中使用宏,并且必须从另一个命名空间中调用宏。 – shadeglare 2013-02-21 12:49:47

+0

@MaxFX,宏不是“调用”,它们被替换。如果你需要使用宏来处理过于复杂的事情,那么你做错了什么。 – StoryTeller 2013-02-21 12:50:43