2016-08-18 12 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関数に変換するか、マクロを呼び出す前に値を保持する変数を宣言することをお勧めします。

2番目のオプションは、次のようになります。

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) 
関連する問題