这是一段代码。但我知道这显然会给出一个错误“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));
}
尝试使用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]
...
重要的是要提到编译的步骤如下:
#define
是 C 中的预处理器指令,这意味着如果您将执行以下操作:
#define MAX 1
然后在所有有 a 的地方进行代码预处理后,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);
}