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

+0

@MaxFX、マクロは「呼び出されていません」と置き換えられます。あなたが過度に複雑な何かのためにマクロを使用する必要がある場合、あなたは何か間違っている。 – StoryTeller