【问题标题】:#define f(x1,x2) x1##x2 void main() { int i; int s1,s10,s100,s1000; for(i=1;i<5;i*=10) printf("%d ",(f(s,i)=i)); }#define f(x1,x2) x1##x2 void main() { int i;整数 s1,s10,s100,s1000; for(i=1;i<5;i*=10) printf("%d",(f(s,i)=i)); }
【发布时间】:2013-03-28 09:11:06
【问题描述】:

这是一段代码。但我知道这显然会给出一个错误“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));  
}

【问题讨论】:

  • 不,这在 C 中根本不可能。
  • -1,请为您的问题提供一个像样的标题

标签: c tokenize


【解决方案1】:

尝试使用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] ...

【讨论】:

    【解决方案2】:

    值得一提的是,编译过程有以下几个步骤:

    1. 预处理(处理所有#define、#include、#ifdef 等)
    2. 编译(实际代码编译和生成目标文件)
    3. 链接(将目标文件链接到二进制文件)

    #define 是 C 中的预处理器指令,这意味着如果您将执行以下操作:

    #define MAX 1
    

    然后在所有有MAX 的地方进行代码预处理后,您将得到 1 而不是它。

    以下内容:

    #define f(x1,x2) x1##x2
    

    在预处理时将x1x2 连接在一起:

    f(s, i) => si
    

    所以在编译时您会收到错误,因为您的代码中没有定义 si 变量。

    【讨论】:

      【解决方案3】:

      不,但你可以使用数组来实现同样的效果:

      int i,j;
      int arr[4];
      
      for(i=1,j=0;i<=1000;i*=10,j++) 
          printf("%d ",(arr[j]=i)); 
      

      【讨论】:

        【解决方案4】:

        没有。原因是宏是预处理器的东西而不是运行时的东西。使用数组

        int i,s[4]; 
        
        for(i=1;i<=4;++i) 
           s[i] = pow(10,i);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-23
          • 1970-01-01
          • 2012-12-08
          相关资源
          最近更新 更多