2

ファイル スコープでのみ呼び出したいマクロがあります。関数内で使用された場合、何らかの方法で (コンパイル時または実行時に) 文句を言うことができれば素晴らしいことです。これは可能ですか?

編集: これまでのコメントに対応するには: コードベースで繰り返し使用される静的オブジェクトがあります。これらのオブジェクトはあらゆる場所で使用されるため、これらのオブジェクトの作成をより速く入力できるようにするマクロを作成しました。これは、キーストロークの節約が生産性/煩わしさにとって重要になるところまで来ています。

この時点まで、私はこれらのオブジェクトを関数内の静的として作成していました。これがスレッドセーフではないことが最近発見されました。これらのオブジェクトをすべて関数の外に移動して、遅延ではなくプログラムの開始時に作成されるようにすることにしました。このバグが将来再び発生するのを防ぐために、フェイルセーフがあればいいのではないかと思いました.

明確にするために、これは進歩をまったく妨げていません。それが簡単/可能であれば、マクロへの素晴らしい追加になると私が思ったものです。

4

1 に答える 1

4

あなたが探しているのは、関数レベルではなくファイル レベルで機能する構造です。私の頭の上では、名前空間が法案に適合するはずです。

#define FOO(x) namespace { x }

FOO(int bar = 42;) // Compiles

void f() {
    FOO(int bar = 42;) // Doesn't compile
}

何をラップしようとしているのか正確にはわからないので、このマクロはできるだけ単純にしました。実際の実装では、適切で安全であることを確認するために、標準のマクロ作成トリックを使用する必要があります。

匿名の名前空間は、その中で作成されたすべてのオブジェクトが現在のコンパイル単位にのみ見えるようにすることに注意してください。あなたの場合、オブジェクトは関数レベルで宣言されていたため、現在のコンパイル単位の外では見えないため、これは問題になりません。

于 2012-07-29T04:26:19.160 に答える