左值

2016-08-18 54 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 } 

但是在編譯時,我得到以下錯誤: -

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)。你需要一個變量(一個可修改的左值)才能夠實現這一點。你的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)