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

Я не могу понять проблему, любезно помогите, спасибо.


person Dhannanjai    schedule 18.08.2016    source источник
comment
потому что вы не можете сделать --5 в c!   -  person Brian Sidebotham    schedule 18.08.2016
comment
Я думаю, вы путаете макросы с вызовами функций. 5 здесь не назначается x.   -  person Haris    schedule 18.08.2016


Ответы (2)


После расширения marco это утверждение

print(5,c);

становится

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

Как видите, вы не можете уменьшить буквальное значение (--5). Для этого вам нужна переменная (изменяемое lvalue). Ваш Марко выглядит лишним. Вы можете просто использовать цикл:

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)
person P.P    schedule 18.08.2016

Макросы расширяются препроцессором, и результат передается компилятору.

Ваш код будет расширен до:

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

Как видите, x заменяется фактическим выражением аргумента в каждом экземпляре. Это не работает, как в обычной функции, где переменная аргумента является локальной копией значения выражения.

Я предлагаю вам либо преобразовать макрос в функцию C, либо объявить переменную для хранения значения перед вызовом макроса.

Второй вариант будет выглядеть так:

int n = 5;
print(n,c);
person Klas Lindbäck    schedule 18.08.2016