1

次のコードを書きます。

#define GATE(name, num)do{\
  name##list[num] = #name;\
}while(0)

char* name[] = {"hello", "world", "byebye"};

int i;
for(i = 0; i < 3; i++)
{
    GATE(name[i],0);
}

明らかに、必要なものを取得できず、 にGATE(name[0],0)置き換えられますhellolist[0] = "hello"name[0]list[0] = "hello"、gcc エラーが発生する可能性があります。

マクロを使って自分の作りたいものを作る方法を知りたいです。

4

3 に答える 3

5

いいえ、これはできません。プリプロセッサは、コンパイラが起動する前にテキストの置換を行います。したがって、プリプロセッサは文字列「hello」を実際に見ることはありませんhellolist

于 2012-06-11T09:27:51.793 に答える
2

あなたが望んでいたことを、あなたが意図した方法で行うことはできないと思います。ただし、マクロを変更することで、必要なものが得られると思います。次のことを試してください。

#define GATE(source_arr, source_index, list_index)do{\
  source_arr##list[list_index] = source_arr[source_index];\
  }while(0)    

char *name[] = {"hello", "world", "byebye"};

int i;

for(i = 0; i < 3; i++)
{
  GATE(name, i, 0);
}

これは、ソース配列からリテラル テキスト (「hello」など) をコピーしないことに注意してください。代わりに、単にポインターをコピーします (namelist はポインターの配列であると想定しています)。「こんにちは」などを一定にする必要がある場合は、 のデラレーションを変更してnameを含めることをお勧めしますconst。また、同じ名前の変数との混同を避けるために、GATE マクロの最初の引数のタイトルを変更したことにも注意してください。うまくいけば、これが役に立ちます。

共有してお楽しみください。

于 2012-06-11T11:43:09.563 に答える
1

前処理はコンパイルの前に最初に行われるため、上記の cnicutar で述べたように、期待される出力は表示されません。

何が起こっているのかを正確に理解するには、gcc で "-E" オプションを指定してファイルを実行し、MSVC コンパイラで /E オプションを指定してファイルを実行し、プリプロセッサの出力を確認します。

于 2012-06-11T09:35:08.233 に答える