0

フォームのいくつかの変数にアクセスしたい:

int arr1=1;
int arr2=1;
int arr3=1;

だから私は書いた

#define arr(i) arr##i

しかし、次のコードは期待どおりに機能しません

#include <stdio.h>

int main(){
int arr1=1;
int arr2=1;
int arr3=1;
int j;
    for(j=1; j<3; j++)
        printf("%d",arr(j));

return 0;
}
4

3 に答える 3

6

これはできません。C では実行時に変数名は存在しません。

マクロarrjは、未定義の変数名である に展開されます。適切な配列を使用します。

int arr[] = { 1, 1, 1 };

次に printarr[j]を実行しますが、次のようにループします。

for(j = 0; j < sizeof arr / sizeof *arr; ++j)
  printf("%d\n, arr[j]);
于 2013-01-15T15:49:57.057 に答える
3

マクロ コードは、ランタイム フェーズではなく、プリプロセッサ フェーズに使用されます。

を使用してプリプロセッサ コードを生成する場合gcc -E。コードが次と同等であることがわかります。

int main(){
int arr1=1;
int arr2=1;
int arr3=1;
int j;
    for(j=1; j<3; j++)
        printf("%d",arrj);

return 0;
}

プログラムをビルドすると、gcc は C コードから別の C コードを生成し、コード内のすべてのマクロをマクロの内容に置き換えます (このフェーズはプリプロセッサ フェーズと呼ばれます)。次に asm コードを生成し、バイナリ ファイルを生成します。

生成された c コード (コードから) はgcc -E、プリプロセッサ フェーズの : code で確認できます。

于 2013-01-15T15:49:37.630 に答える
0

というarrjことで結果として出てきます。

C のマクロ フェーズは、プログラムが実行される前、実際の C として解析される前に発生するものです。

昔は、プリプロセッサは C 言語についてほとんど知らなかった完全に独立したプログラムでした。

今日のほとんどのコンパイラと同様に、cc当時はさまざまなフェーズを実行するだけでした。コンパイラ、アセンブラ、リンカを実行する前cppに、C プリプロセッサを実行しました。

cppは定義を解析し、マクロを展開して終了しました。次に、ccはコンパイラを実行します。最近では、マクロ展開はコンパイラ本体に組み込まれていますが、元の設計に従ってプログラムのテキスト入力を処理します。

現在でも一部のシステムには がありますが、通常はdon't compile/usr/bin/cppというオプションを指定してコンパイラ イメージを実行する単なるシェル スクリプトです。

于 2013-01-15T15:56:09.743 に答える