4

いくつかの条件 (マクロのパラメーターではなく の存在) に基づいて、#define INITED値を返すか、次のようなコンパイラ エラーを生成するマクロを定義したいと考えています。

#error Not initialized!

私は(のためにmyIdea.h)試しました:

#ifdef INITED
    #define MyMacro(x) x->method(); //something with x
#else
    #define MyMacro(x) #error Not initalized!
#endif

しかし、そのコードはエラーを生成します(私が望んでいたものではありません)expected macro format parameter

私はそのコードを望んでいないことに注意してください(動作しますが、少し異なることをしています):

#ifdef INITED
    #define MyMacro(x) x->method(); //something with x
#else
    #error Not initalized!
#endif

上記のコードは、INITED が定義されていない場合にのみエラーを生成します。AND INITED has not been definedを呼び出したときにMyMacro()のみエラーを生成したい。

私は最初のコードの奴隷ではありませんが、結果が上記で説明した方法とまったく同じように機能することを望んでいます (マクロMyMacro IF 定数が初期化されているときにエラーを生成します)。

4

1 に答える 1

6

これは不可能です。プリプロセッサは非常に単純なものであり、そのようなネストされたマクロを解析しません。2 番目のシャープ ( #) は、プリプロセッサによってネストされたマクロとして認識されません。引数はほとんど生の文字列として扱われます。

#errorただし、ディレクティブの代わりに C++11 以降で静的アサートを調べることができます。あなたは次のようなものを書いているでしょう:

#ifdef INITED
    #define MyMacro(x) x->method(); //something with x
#else
    #define MyMacro(x) static_assert(false, "Not initalized!");
#endif
于 2014-04-27T07:54:59.877 に答える