좌변

2016-08-18 4 views
1

나는 다음과 같은 코드 인수로 매크로를 사용하여 시간의 문자열 '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 } 

그러나 컴파일하는 동안, I 다음과 같은 오류가 나타납니다. -

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

문제를 파악할 수 없으므로 친절하게 도와주세요.

+3

당신이 할 수 없기 때문에'--5' C에! –

+0

매크로를 혼동스럽게 생각하고 있습니다. '5'는'x'에 할당되지 않습니다. – Haris

답변

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

,이 사항이

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)