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

时间:2016-08-18 10:13:47

标签: c macros lvalue

我正在尝试打印字符串' x'使用宏作为参数的次数,使用以下代码: -

 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);
   ^

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

for(int i = 1; i <= 50; i++){
 if(i % 10 != 0){
    Console.Write(i);
    Console.Write(" ");
 }
}

我无法弄清楚问题,请帮助谢谢。

2 个答案:

答案 0 :(得分:3)

马克扩张后,这句话

print(5,c);

变为

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

如您所见,您无法减少文字值(--5)。您需要一个变量(一个可修改的左值)才能实现这一点。你的marco看起来多余了。你可以简单地使用一个循环:

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)

答案 1 :(得分: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);