2017-02-22 73 views
2

所以,我得到了一個函數,我聲明瞭一個已經填充的結構,並且還想聲明一個新的函數。當我在頂部聲明新函數時,它的工作原理是,當我在逗號(,)之後的同一行上聲明它時,它可以工作,但它不起作用。任何解釋?提前致謝。爲什麼我不能在函數中第二次聲明結構?

void CFilter(float avgprofit, int lines) 
{ 
    //client goodclient[MAX_CLIENT]; THIS WOULD COMPILE 
    client client[MAX_CLIENT], goodclient[MAX_CLIENT]; // THIS COMPILES 
    //client goodclient[MAX_CLIENT]; THIS WOULDN'T COMPILE 
    int i, amount = 0; 
    float userprofit; 
    for (i = 0; i <= lines; i++) { 
     userprofit = client[i].loses - client[i].wins; 
     if (userprofit >= avgprofit) { 
      client[i].goodclient = 1; 
     } else { 
      client[i].goodclient = 0; 
     } 
    } 
} 
+0

當你有下一行的'goodclient',你是否從前一行刪除它?目前還不清楚。順便說一句,請避免使用與其類型相同的名稱作爲變量。充其量:混亂,最糟糕的是:錯誤。 –

+0

*爲什麼我不能在函數中第二次聲明結構?*因爲你不能。它實際上是一個*定義*,它不能被複制。然而,一個重複的*聲明(例如函數原型或外部變量)可以 - 只要它們全都相同。 –

+0

用大寫字母開始類型的好主意 - 然後可以告訴它們不同於變量 –

回答

5

的問題是,在陣列client的名稱隱藏類型client的名稱。

client client[MAX_CLIENT]; 
client goodclient[MAX_CLIENT]; 

所以在第二個聲明中編譯器認爲名稱client作爲數組的名稱。

對不同的實體使用相同的名稱並不是一個好主意。

使編譯器編譯聲明最簡單的方法是重命名該數組。

或者,如果類型client是具有相同名稱的結構類型的typedef,那麼你可以寫例如

client client[MAX_CLIENT]; 
struct client goodclient[MAX_CLIENT]; 

另一種方式就是交換的聲明

client goodclient[MAX_CLIENT]; 
client client[MAX_CLIENT]; 
相關問題