3

尝试将连接与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”?

4

8 回答 8

2

这在预处理器阶段是不可能的,因为您想要的取决于稍后在运行时才知道的值。

您需要的是一个数组和索引运算符,var[i].

于 2011-10-20T19:47:18.017 回答
2

不,预处理器在编译之前工作,因此在执行之前。

定义

#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]);      
}
于 2011-10-20T19:46:34.410 回答
0

不 i 是运行时评估。预处理器无法知道 I 的值是多少。

于 2011-10-20T19:47:27.953 回答
0

你为什么要用预处理器来做这个?

您似乎正在尝试重新发明数组:

int main() {
    int var[] = {999, 998, 997, 996, 995};
    int i;

    for (i=0; i<5; i++)
        printf("Valor: %i\n", var[i]);
    return 0;
}
于 2011-10-20T19:47:44.660 回答
0

您需要注意宏在编译文件之前(由预处理器)解析一次,因此在运行时,循环中的每次迭代都会在“调用”替代时呈现相同的结果。

于 2011-10-20T19:46:29.640 回答
0

不,因为预处理器在编译时运行,而不是运行时,但您可以使用数组:

int vars[] = { 999, 998, 997, 996, 995 };

for (int i = 0; i < 5; ++i)
    printf("Valor: %i \n", vars[i]);
于 2011-10-20T19:47:02.103 回答
0


正如许多人所说 - 不,宏对程序编译时或运行时发生的事情一无所知。但是...如果您希望可以使用直接与堆栈一起操作的宏生成一些骇人听闻的代码(不要单独在家中尝试此操作-它可能会使您的计算机崩溃!!:-))-将您的宏定义为:

#define substitute(adr, max, id) *(adr + max - id)

并像这样调用:

printf("Valor: %i \n",  substitute(&var4,4,i));

但请记住,这只是出于好奇,在现实生活中不建议直接使用堆栈,因为编译器可能(并且通常会)重新排序堆栈上的变量分配,并且您将冒着发生一些讨厌的错误的风险,并且等等......正如其他人所说的那样更好 - 制作一些数组并对其进行操作。

嗯!

于 2011-10-23T10:07:17.643 回答
-1

C 宏仅在编译时扩展,您的 printf 行将变为

      printf("Valor: %i \n",  vari);      
于 2011-10-20T19:47:18.063 回答