在尝试使用C预处理器连接时,我遇到了以下问题:
#define substitute(id) var##id
int main()
{
int var0 = 999;
int var1 = 998;
int var2 = 997;
int var3 = 996;
int var4 = 995;
int i = 0;
for(i; i < 5; i++)
{
printf("Valor: %i n", substitute(i));
}
system("PAUSE");
return 0;
}
是否有一种方法可以让预处理器能够读取"i"上的值,而不仅仅是连接"vari"?
No。预处理器在编译之前工作,因此在执行之前。
定义#define substitute(id) var##id
将导致循环扩展为:
for(i; i < 5; i++)
{
printf("Valor: %i n", vari);
}
预处理器不知道变量i,也不应该知道。
你可能应该使用数组:
int var[5] = {999,998,997,996,995};
并通过[]
:
访问for(i; i < 5; i++)
{
printf("Valor: %i n", var[i]);
}
这在预处理器阶段是不可能的,因为您想要的依赖于只有在运行时才知道的值。
您需要的是一个数组和索引操作符var[i]
。
您需要注意,在编译文件之前,宏会被解析一次(由预处理器),因此在运行时,当"调用" substitute时,循环中的每次迭代都会呈现相同的结果。
不,因为预处理器在编译时运行,而不是运行时,但是您可以使用数组:
int vars[] = { 999, 998, 997, 996, 995 };
for (int i = 0; i < 5; ++i)
printf("Valor: %i n", vars[i]);
不,i是运行时求值。预处理器没有办法知道I的值是多少。
为什么要用预处理器这样做?
你似乎想重新发明数组:
int main() {
int var[] = {999, 998, 997, 996, 995};
int i;
for (i=0; i<5; i++)
printf("Valor: %in", var[i]);
return 0;
}
正如许多人所说——不,宏并不知道程序编译时或
运行时发生了什么。但是…如果你希望你的可以生成一些hack代码与宏直接与堆栈操作(不要在家里独自尝试-它可以炸毁你的电脑!!:-))-将宏定义为:
#define substitute(adr, max, id) *(adr + max - id)
和这样调用:
printf("Valor: %i n", substitute(&var4,4,i));
但请记住,这只是出于好奇,在现实生活中,不建议直接使用堆栈,因为编译器可能(通常会)在堆栈上重新排序变量分配,而且你还会冒一些讨厌的bug发生的风险等等…所以就像其他人说的那样——创建一个数组并对其进行操作。
hth !
C宏只在编译时展开,您的printf行将变成
printf("Valor: %i n", vari);