用C预处理器读取变量



在尝试使用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);      

最新更新