私はいくつかのコードを見ていて、全体のロジックがここで意味をなさないと思う。このようなマクロを持つのはかなり貧弱です。 例として、このマクロを2回使用して、両方の文字列を出力します。マクロ内の静的変数
TESTING("hello");
TESTING("world");
プリプロセッサは、単にコードのブロックと識別子を置き換え、それがコードをペースト/コピーと同じであるので、このマクロを使用する場合、コンパイラは、FirstPassのために再定義エラーを与えるべきではありません複数回? (手動
main
、static bool firstPass = true;
複数回に貼り付けると、コンパイラはエラーになります。)firstPass
がstatic
であれば、それは一度だけ作成され、初期化されます。このマクロを複数回使用すると、フラグがfalse
に設定されているため、(最初の使用以外に)結果が生成されることはありませんが、毎回cout
になります。
少し混乱します。
#define TESTING(input) \
{ \
static bool firstPass = true; \
if (firstPass) { \
std::cout << input; \
firstPass = false; \
} \
}
を印刷します関数テンプレートの代わりにマクロを使用するのは悪いことです。 – LogicStuff
このコードは無意味です。あなたがそれを呼び出すたびに、スコープの規則のために新しい 'firstPass'があります。 – NathanOliver
あなたの誤解は、マクロそのものではなく、マクロの内容(特にブロック '{...}')にあるようです。つまり、手動でマクロの内容をコピーして貼り付けると、マクロの問題がなくなります。 – chris