0

私は次のマクロを持っています

#define FIRST(first) \
 switch(first, 0) default:

#define LAST(last) \
 switch(0) for(;0;last) default:

#define BRACKET(first, last) \
 switch(first, 0) for(;0;last) default:

そして、それらはそのように使用されます。

#include <stdio.h>

// ... Macros are defined here

int main (int argc, const char * argv[])
{
    int x;

    FIRST(x = 4)
    {
        printf("%i\n", x);
    }

    LAST(++x)
    {
        printf("%i\n", x);
    }

    printf("%i\n", x);

    return 0;
}

BRACKET は、単に FIRST と LAST を組み合わせたものです。ただし、FIRST マクロ (および BRACKET マクロ) は十分ではありません。y が中かっこにスコープされている次のコードを記述できるようにしたいと思います。

    FIRST(int y = 0)
    {
        printf("%i\n", y);
    }

C プログラミング言語で FIRST マクロを作成して、中かっこ内で範囲指定された変数を宣言するにはどうすればよいですか?

いくつかのコーナーケースは次のとおりです。

次のコード スニペットを許可したい

FIRST(int x = 0)
 printf("%i\n", x);

次のコード スニペットを禁止してほしい

FIRST(int x = 0)
 printf("%i\n", x);

++x;
printf("%i\n", x);

PS "switch(0) for(;0;last) default:" がコンパイラによって受け入れられることに驚いていますが、これは本当に合法的な C コードですか?

4

1 に答える 1

1

少なくとも C99 に準拠しているコンパイラがあれば、必要な方法でスコープ付き変数を取得するのは簡単です。(それ以外の場合は、そうしないか、最新のコンパイラを入手してください)。

ブロックまたはステートメントの接頭辞 likeFIRST(int y = 0)は、次のようなもので実現できます

for (int t = 0; t < 1; ++t)
  for(int y = 0; t < 1; ++t)

つまり、ループが 1 回だけ実行されるように制御する補助変数を定義します。最新のコンパイラは、これに伴うノイズを簡単に最適化し、本質的な部分に進みます。

多少の注意を払えば、それをマクロに詰め込むことができます。この場合、名前が何が起こっているかを捉え、仲間のプログラマーの目を傷つけないように注意する必要があります。break特に、そのようなことはandcontinueステートメントのセマンティクスを知らない読者にとって非常に驚くべきものに変えるという大きな警告ラベルをどこかに置いてください。

-scopesを使用したスコープ バインド リソース管理についてfor詳しく説明しました。

于 2012-04-29T21:17:51.860 に答える