0

私はいくつかのCコードを読んでいて、ここで動けなくなりました。

以下に、ヘッダー ファイルのコード スニペットを示します。

#if NUMREPS == 0
        #define REPEAT(line) REPEAT0(line);
#elif NUMREPS == 16
        #define REPEAT(line) REPEAT16(line);
#endif

識別子の導関数は次のようrepeat16(line);に定義されます。

#define REPEAT16(line) \
    line;\
    line;\
    line;\
    line;\
    line;\
    line;\
    line;\
    line;\
    line;\
    line;\
    line;\
    line;\
    line;\
    line;\
    line;\
    line;

このコード スニペットは正確に何をしますか? コードを理解するためにこのリンクの助けを借りました

4

2 に答える 2

6

プリプロセッサは、実際のコンパイルの前に実行されるコンパイル プロセスのステップです。マクロで行うことは、マクロの呼び出しをマクロの本体に置き換えるだけです。したがって、プリプロセッサがその「呼び出し」を見ると、REPEAT16それをマクロへの引数に置き換えるだけで、本体と同じように 16 回繰り返されます。

引数lineはまさにマクロに渡すものなので、たとえば次のように呼び出すと

REPEAT16(printf("hello\n"))

コンパイラが認識するコードは次のようになります

printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n"); printf("hello\n");

マクロ本体の\文字は、現在の行が次の行に続くことをプリプロセッサに伝えるだけです。すると全身が一本の線になります。

于 2013-06-02T10:25:10.460 に答える
4

行末のバックスラッシュ ( \) は、プリプロセッサによって次の行に置き換えられます。

これは、複数行のマクロ定義を記述する一般的な方法です。置換テキストは単一の「論理」行にある必要があるため、読みやすくするために行継続が使用されます。

これは、マクロを使用して関数全体を定義するときによく使用されます。

#define INT_RETURNER(x)  int return_ ## x (void)\
                         {\
                           return x;\
                         }

INT_RETURNER(4711)

int main(void)
{
  printf("%d!\n", return_4711());
}
于 2013-06-02T10:27:35.140 に答える