2013-02-21 131 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