2017-05-07 69 views
1

爲什麼我們不能使用extern使結構在多個.c文件中可訪問?使用extern結構中的C

我知道建議是在.h文件中加入struct的定義,並將.h文件包含到我們使用該結構的每個.c文件中,但爲什麼我們可以使用extern作爲變量,但它不起作用結構?

爲外部變量:

  1. 定義變量的.c文件
  2. 外部變量在我們希望它被使用
  3. 構建兩個.c文件.c文件中,其中一個變量是定義和使用它的地方

但是結構的情況如何?

糾正我,如果我錯了某處。

+0

C設計用於分段編譯,您可以編譯單獨的文件,然後將它們拼合在一起。使用結構涉及訪問其成員的代碼,如果結構定義在很晚之後纔可用,該代碼應該如何發出? – StoryTeller

+1

變量是存儲(運行時)的東西。因此,'extern'和'static'實際上是提示鏈接器給兩個具有相同名稱的存儲器('extern')或不同的存儲器('static')。 (這是你可以想象的 - 標準用不同的文字說出來的......)然而,在編譯時會評估一個類型(例如'struct')。它在使用前不會產生代碼(例如在變量中)。因此,存儲類(例如'extern'和'static')對類型沒有影響。如果您想共享一個類型,請在每個C文件中重新定義它(例如,將其放入每個 – Scheff

+1

... C文件中將包含的頭文件中)。 – Scheff

回答

2

存儲級別說明符extern用於控制鏈接(請參閱C11 draft 6.2.2),即哪些標識符引用同一對象或函數。然而,它並不是一個定義(即函數的對象或函數體的存儲保留,見6.7.5),而是一個類型聲明(見6.2.5.20和6.7.2.1.6)。


備註:這種區別也是在6.2.2.6的顯式:

以下標識符沒有起重:聲明爲 標識符比對象或功能的其它任何東西; ...