带有参数的宏的赋值操作数需要C - lvalue作为左操作数



我试图打印一个字符串'x'次使用宏作为参数与以下代码:-

 1 #include<string.h>
 2 #include<stdio.h>
 3 #define print(x,c)      while(x>0)
 4 {
 5         puts(c);
 6         printf("n");
 7         --x;
 8 }
 9 
 10 int main()
 11 {
 12         char c[20];
 13         strcpy(c,"Hallelujah");
 14         print(5,c);
 15 }

但是在编译时,我得到以下错误:-

 macro2.c: In function ‘main’:
 macro2.c:7:2: error: lvalue required as decrement operand 
   --x;
   ^
 macro2.c:14:2: note: in expansion of macro ‘print’
   print(5,c);
   ^

我无法解决这个问题,请帮忙,谢谢。

marco展开后,下面的语句

print(5,c);

while(5>0) { puts(c); printf("n"); --5; };

可以看到,不能减少文字值(--5)。您需要一个变量(一个可修改的左值)来实现这一点。你的马可看起来多余。你可以简单地使用一个循环:

int x = 5;
while(x > 0) { 
   puts(c); 
   printf("n"); 
   --x; 
}

如果你真的想要使用宏,那么你可以这样做:

 #define print(x,c)  do { 
 int t = x; 
 while(t>0) {
         puts(c);
         printf("n");
         --t;
 } 
} while(0)

宏由预处理器展开,并将结果交给编译器。

您的代码将扩展为:

 int main()
 {
      char c[20];
      strcpy(c,"Hallelujah");
      while(5>0)
      {
         puts(c);
         printf("n");
         --5;
      }
  }

可以看到,在每个实例中,x被替换为实际的参数表达式。它的工作方式与常规函数不同,常规函数的参数变量是表达式值的局部副本。

我建议您将宏转换为C函数,或者在调用宏之前声明一个变量来保存该值。

第二个选项看起来像这样:

int n = 5;
print(n,c);

最新更新