2011-04-02 86 views
2
int func(struct x{int a;}y); 
int main() 
{ 

} 

上面的代碼給出了在C++
錯誤以下錯誤:類型可能無法在參數類型被定義
而在C其運行細跟警告,意味着在C類型可被限定在參數列表
因此下面的代碼應該給redefination錯誤在C類型定義

int func(int a,int a); 
int main() 
{ 

} 

的疑問:爲什麼上面的代碼在C++中
錯誤給錯誤:多參數命名爲

+0

懷疑這不是至少兩個不同的問題嗎? – 2011-04-02 22:49:09

回答

4

由於參數名稱在其參數列表中的範圍內,因此參數具有相同的名稱兩次是錯誤的。我認爲很明顯,有兩個參數具有相同的名稱是沒有用的?

// Explain why you want to have them say "int a, int a" 
int func(int a, int b); 

在C中,允許在參數類型列表中定義結構類型的內容。標籤標識符具有原型範圍或塊範圍(當函數是一個定義時)並且沒有鏈接,這意味着它不同於在原型之外聲明的結構或塊,其標籤標識符具有文件範圍。你不能從它的內部遞歸調用這樣的函數。

int func(struct x{int a;} y) { 
    func(y); // fine (the call, not the endless recursion) 
} 

注意,這僅適用於該func中的定義相同翻譯單位中發生的呼叫。如果另一個編譯單元聲明的功能和結構如下,這完全是罰款,該函數將可以調用(您需要確保上述聲明不可見,否則會發生衝突,因爲兩個點的x表示不同類型)。

struct x {int a;}; 
int func(struct x y); 

在這兩個翻譯單元,即使x是不同類型的(因爲它們是不同的翻譯單元),該類型是兼容,這是對參數類型唯一重要的東西。

您不僅可以定義在參數列表中的結構,而且在功能

struct x {int a;} func(void) { 
    return (struct x){ 0 }; 
} 

這也只適用於C的返回類型部分沒有這樣的事情被允許在C++中。

3

我不確定你在做什麼。但是,如果func需要採取struct x類型,然後的參數的函數 -

struct x 
{ 
    // .... 
}; 

int func(struct x obj) ; 
int func(int a, int b) ; // Notice that the second parameter is changed 
          // from a to b. Both the parameters cannot have 
          // the same name 

好吧,你正試圖定義一個結構作爲函數參數的一部分。如果存在這種可能性,那麼該定義將侷限於該功能。在調用該函數時如何傳遞參數,因爲結構x在除func之外的其他地方都不可見。

+0

+1用於解釋爲什麼這是不可能的。 – Johnsyweb 2011-04-02 09:02:46

+0

@Johnsyweb - 這只是我的猜測。但是讓我們等待是否有人可以說我錯了,因爲在C++中,每件事都有可能通過某種我不知道的黑客行爲來實現。 – Mahesh 2011-04-02 09:06:32

0

我不確定。但如果你問爲什麼這樣的錯誤,而在此之前它是關於在第一種情況下C++中的語法這是典型的類型定義,這是不是在C不允許類型定義

  • ++(看馬赫什怎麼做它應該)
  • 第二不包含任何類型定義,所以不要抱怨,但關於其他種類的問題

...還是我理解這個問題