2010-06-22 67 views
1

foo.c的重複結構定義

struct foo { 
    int a; 
}; 

bar.c 

struct foo { 
    char *s; 
    double x,y; 
}; 

的結構定義只在.c文件。根據C標準是否合法?標準的哪一部分如此說明? 編輯:沒有#include結構定義。

謝謝大家的快速響應! :D

回答

6

該代碼完全合法C.您可能會遇到調試器問題(將一種類型誤認爲另一種類型,試圖將其中一種顯示爲另一種類型),但從語言的角度來看,這樣做很好。

沒有標準的任何部分可以直接說這是合法的。相反,沒有任何標準說明它是非法的。

因爲C++將鏈接的概念擴展爲類,而C++類中的非本地鏈接始終具有外部鏈接,所以類似這樣的內容在C++中將是非法的。

+0

對第二段沒有把握。沒有什麼說我不能在我的代碼中放大象;) – sje397 2010-07-19 17:12:53

+0

@ sje397:是的,但標準甚至沒有引入「大象」的概念。至於結構類型 - 它們存在於標準中,並且結構的聲明規則也在標準中描述。該標準說明了在程序中使用結構類型需要做些什麼,只要滿足這些要求,您就可以。 – AnT 2010-07-19 18:22:38

+0

基本上,它就像是問你將結構類型命名爲「Abcdef」是否合法。你會如何回答這樣的問題?如果你只是說「是」,那麼接下來的問題將是'Dgefht'作爲一個結構類型名稱。這個好嗎?等等......所以,當涉及到這樣的問題時,正確的答案是,如果標準不禁止這樣的標識符,那麼使用它就可以。與原始問題中的結構聲明一樣。 – AnT 2010-07-19 18:25:21

6

C99標準的第6.2.1-4節指出它是合法的,因爲它們都在不同的範圍內聲明(每個文件的文件範圍從其定義延伸到翻譯單元的末尾,即文件)。

+0

但是,聯動表示可以使來自不同範圍的兩個標識符引用同一個對象。在這種情況下他們倆是不是都有外部聯繫? – 2010-06-22 14:35:24

+0

我讀了6.2.2-6,指出缺省情況下,結構體沒有鏈接(一個結構體不是對象) – sje397 2010-06-22 14:45:28

+1

@Owen S:在C語言中,* linkage *的概念不適用於* types *。在C鏈接中僅適用於對象或函數。 – AnT 2010-06-22 14:49:00