ここにコードがあります。しかし、これは明らかにエラー "si undeclared" を与えることを知っています。トークンの貼り付け中に i をその値に置き換える解決策はありますか
#define f(x1,x2) x1##x2
void main()
{
int i,s1,s10,s100,s1000;
for(i=1;i<=1000;i*=10)
printf("%d ",(f(s,i)=i));
}
コンパイルには次の手順が実行されることに注意してください。
#define
は C のプリプロセッサ ディレクティブです。つまり、次のことを行うかどうかを意味します。
#define MAX 1
次に、 があるすべての場所でコードを前処理した後、MAX
代わりに 1 を取得します。
以下:
#define f(x1,x2) x1##x2
前処理で接続x1
してx2
一緒にします:
f(s, i) => si
si
したがって、変数がコードで定義されていないため、コンパイル時にエラーが発生します。
いいえ。ただし、配列を使用して同じことを実現できます。
int i,j;
int arr[4];
for(i=1,j=0;i<=1000;i*=10,j++)
printf("%d ",(arr[j]=i));
いいえ。その理由は、マクロは実行時のものではなく、プリプロセッサのものだからです。配列を使用する
int i,s[4];
for(i=1;i<=4;++i)
s[i] = pow(10,i);
}
でコードをビルドしてみてくださいgcc -E
。これにより、プリプロセッサ コードが生成されます。プリプロセッサ コードが次のようになっていることがわかります。
void main()
{
int i,s1,s10,s100,s1000;
for(i=1;i<=1000;i*=10)
printf("%d ",(si=i));
}
プリプロセッサ コードは、コンパイラがバイナリを構築する前に元のコードから生成するコードです。プリプロセッサ コードでは、コンパイラはすべてのマクロをその内容に置き換えます。したがって、コンパイラはf(s,i)
マクロコンテンツに置き換えられるため、次のように置き換えられますsi
したがって、C でそれを行うことは不可能です。代わりに配列を使用することをお勧めします
s1
使用する代わりにs[1]
...