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

マクロで名前空間付きオブジェクトを使用する適切なバリアントは何ですか?

4

2 に答える 2

10

マクロは、名前空間について何も知らないプリプロセッサによって処理されます。したがって、マクロは名前空間ではなく、単なるテキスト置換です。マクロは常にグローバル名前空間を汚染するため、マクロの使用はお勧めできません。

メッセージを出力する必要があり、それを名前空間にする必要がある場合は、単純にインライン関数を使用してください。コードは、適切にインライン化できるほど単純に見えます。

namespace a
{
  inline void MESSAGE_A(const char* message) 
  {
    std::cout << message << std::endl;
  }
}
于 2013-02-21T12:45:08.147 に答える
2

効果がないでしょう。マクロスは名前空間について何も知りません。名前空間を使用する場合は、マクロを使用しないでください。

于 2013-02-21T12:44:11.097 に答える