【问题标题】:Reading variables with C preprocessor使用 C 预处理器读取变量
【发布时间】:2023-03-22 01:28:01
【问题描述】:

我在尝试使用 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”?

【问题讨论】:

    标签: c c-preprocessor string-concatenation stringification


    【解决方案1】:

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

    定义

    #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]);      
    }
    

    【讨论】:

    • 谢谢。实际上,我对值而不是变量使用了#defines,因此使用预处理器的想法似乎不那么不合逻辑。但是,如果没有迭代能力,我认为唯一的解决方案是使用数组。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        int vars[] = { 999, 998, 997, 996, 995 };
        
        for (int i = 0; i < 5; ++i)
            printf("Valor: %i \n", vars[i]);
        

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

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

            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;
            }
            

            【讨论】:

              【解决方案7】:

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

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

              然后这样调用:

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

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

              hth!

              【讨论】:

                【解决方案8】:

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

                      printf("Valor: %i \n",  vari);      
                

                【讨论】:

                • 预处理发生在编译之前。
                • @LuchianGrigore 是的,如果你那么挑剔的话。我认为谈论编译时和运行时是很常见的。编译时间将是获取源代码并制作二进制文件的事件。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-05-25
                • 2021-02-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-06-04
                相关资源
                最近更新 更多