3

Cプリプロセッサで連結を使用しようとすると、次の問題が発生します。

#define substitute(id) var##id
int main()
{
     int var0 = 999;
     int var1 = 998;
     int var2 = 997;
     int var3 = 996;
     int var4 = 995;

     int i = 0;

     for(i; i < 5; i++)
     {
          printf("Valor: %i \n",  substitute(i));      
     }

     system("PAUSE");
     return 0;

}

プリプロセッサが単に「vari」を連結するのではなく、「i」の値を読み取ることができる方法はありますか?

4

8 に答える 8

2

いいえ。プリプロセッサはコンパイル前、つまり実行前に機能します。

定義

#define substitute(id) var##id

ループが次のように拡張されます。

 for(i; i < 5; i++)
 {
      printf("Valor: %i \n",  vari);      
 }

プリプロセッサは変数iについての知識を持っておらず、またそうすべきではありません。

おそらく配列を使用する必要があります。

int var[5] = {999,998,997,996,995};

経由してアクセスします[]

for(i; i < 5; i++)
{
    printf("Valor: %i \n",  var[i]);      
}
于 2011-10-20T19:46:34.410 に答える
2

必要な値は、実行時に後でしかわからない値に依存するため、プリプロセッサの段階ではこれは不可能です。

必要なのは、配列とインデックス演算子ですvar[i]

于 2011-10-20T19:47:18.017 に答える
0

マクロはファイルがコンパイルされる前に(プリプロセッサによって)一度解決されることに注意する必要があります。そのため、実行時に、ループ内の各反復は、置換を「呼び出す」ときに同じ結果をレンダリングします。

于 2011-10-20T19:46:29.640 に答える
0

いいえ、プリプロセッサは実行時ではなくコンパイル時に実行されるためですが、配列を使用できます。

int vars[] = { 999, 998, 997, 996, 995 };

for (int i = 0; i < 5; ++i)
    printf("Valor: %i \n", vars[i]);
于 2011-10-20T19:47:02.103 に答える
0

いいえiは実行時評価です。プリプロセッサが私の価値を知る方法はありません。

于 2011-10-20T19:47:27.953 に答える
0

なぜプリプロセッサでこれを行うのですか?

あなたはアレイを再発明しようとしているようです:

int main() {
    int var[] = {999, 998, 997, 996, 995};
    int i;

    for (i=0; i<5; i++)
        printf("Valor: %i\n", var[i]);
    return 0;
}
于 2011-10-20T19:47:44.660 に答える
0


多くの人が言ったように-いいえ、マクロはプログラムのコンパイル時または実行時に何が起こっているかについて何も知りません。しかし...必要に応じて、スタックで直接動作するマクロを使用してハックなコードを生成できます(これを自宅で単独で試してはいけません-コンピュータを壊してしまう可能性があります!! :-))-マクロを次のように定義します:

#define substitute(adr, max, id) *(adr + max - id)

次のように呼び出します。

printf("Valor: %i \n",  substitute(&var4,4,i));

ただし、これは好奇心のためであり、実際にはスタックで直接プレイすることはお勧めしません。コンパイラはスタック上の変数の割り当てを並べ替える可能性があり(通常はそうするでしょう)、厄介なバグが発生するリスクもあります。など...他の人が言ったように-いくつかの配列を作成し、それを操作します。

hth!

于 2011-10-23T10:07:17.643 に答える
-1

Cマクロはコンパイル時にのみ展開され、printf行は次のようになります。

      printf("Valor: %i \n",  vari);      
于 2011-10-20T19:47:18.063 に答える