2016-01-27 182 views
13

是否允許在同一個項目的兩個不同c文件中使用具有不同定義的相同名稱結構。例如。具有不同定義的相同名稱結構C

FILE1.C

typedef struct 
{ 
    unsigned int unVar;    

} abc; 

file2.c中

typedef struct 
{ 
    int var; 
} abc; 

ABC在這兩個文件中。當我編譯這些文件作爲同一個項目的一部分沒有錯誤,但我想知道這是否正確的用法。

+0

沒有沒有重新定義錯誤。 –

+0

這裏是一個類似的問題http://stackoverflow.com/questions/3995940/casting-one-c-structure-into-another。 – niyasc

+5

@anuj如果它們在不同的編譯單元中,並且如果你不在它們之間交換數據(投射指針),那麼它是安全的。如果這是一個好習慣......那麼這是另一回事。 –

回答

15

6.7.2.1結構和聯合說明符

  • 一個結構聲明列表的在struct-或癒合說明符的存在聲明瞭一個新的類型, 在翻譯單位內。
  • 類型僅在本例中的翻譯單元,.c文件中定義。

    在兩個不同的翻譯單元中定義兩個具有相同名稱的類型沒有問題。

    但是,這兩種類型不兼容,除非它們遵循6.2.7。,p1中描述的規則。您定義的類型是不兼容

    +1

    感謝您的幫助 –

    3

    這是類型定義。每個.c文件都是本地的,沒有理由得到錯誤。定義必須在頭文件中進行,然後你不會有這樣的問題。

    1

    在兩個不同的* .c文件中定義兩個具有相同名稱的結構是正確的用法,因爲它們僅對* .c中定義的當前範圍有效。

    但進一步我不建議這樣做,以避免任何混淆你和任何其他開發人員必須使用兩種類型的相同名稱做其他事情。

    2

    符號的名稱(變量,函數)在翻譯單元中必須是唯一的。

    翻譯單元是基本編譯單元,用於CC++。它由源文件以及所有包含的文件(直接或間接)組成。

    在你的情況,你有兩個獨立的源文件,每個定義一個結構;但他們彼此「看不到」,因爲他們在不同的翻譯單位。

    但是,在鏈接期間,如果在目標鏈接對象中存在多個具有相同名稱的符號(只要這些符號已導出,可以用關鍵字static修改),則可能會遇到麻煩。

    +2

    對於在全局範圍定義的符號,這是正確的,但可以在本地範圍內重新定義符號:變量和結構變量或typedef。 – chqrlie

    1

    每個定義對其出現的文件都是本地的。由於您分別編譯這些文件,編譯器一次只能看到一個文件。鏈接器將目標文件綁定在一起不會驗證類型一致性,它只能按名稱解析符號。

    如果您想要將st_localAscdData或指向st_localAscdData的指針傳遞給來自不同模塊的函數,則必須確保在不同模塊中聲明的類型之間的一致性。這是頭文件的目的。共享聲明屬於頭文件,必須包含在共享給定類型或函數的所有模塊中。

    全局類型一致性不是由C語言實現的,也不是C++在某種程度上的擴展,它是程序員的責任。編碼規則是幫助程序員避免此缺陷的缺陷的指導方針。

    1

    您期望重新定義的錯誤(這將在cpp編譯器中發生),但在C編譯器中不會發生。 這個問題不僅發生在結構上,而且還與各種變量。 我已經提出了一個問題,並有一些細節和質量的答案。

    Does C have One Definition Rule like C++?

    相關問題