-2

ここにコードがあります。しかし、これは明らかにエラー "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));  
}
4

4 に答える 4

0

コンパイルには次の手順が実行されることに注意してください。

  1. 前処理 (すべての #define、#include、#ifdef などの処理)
  2. コンパイル (実際のコードのコンパイルとオブジェクト ファイルの生成)
  3. リンク (オブジェクト ファイルをバイナリにリンクする)

#defineは C のプリプロセッサ ディレクティブです。つまり、次のことを行うかどうかを意味します。

#define MAX 1

次に、 があるすべての場所でコードを前処理した後、MAX代わりに 1 を取得します。

以下:

#define f(x1,x2) x1##x2

前処理で接続x1してx2一緒にします:

f(s, i) => si

siしたがって、変数がコードで定義されていないため、コンパイル時にエラーが発生します。

于 2013-03-28T09:22:57.163 に答える
0

いいえ。ただし、配列を使用して同じことを実現できます。

int i,j;
int arr[4];

for(i=1,j=0;i<=1000;i*=10,j++) 
    printf("%d ",(arr[j]=i)); 
于 2013-03-28T09:24:38.373 に答える
0

いいえ。その理由は、マクロは実行時のものではなく、プリプロセッサのものだからです。配列を使用する

int i,s[4]; 

for(i=1;i<=4;++i) 
   s[i] = pow(10,i);
}
于 2013-03-28T09:27:45.293 に答える
0

でコードをビルドしてみてください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]...

于 2013-03-28T09:13:44.353 に答える