根據 ISO9899:2017 § 6.7-5:
宣告指定一組識別符號的解釋和屬性。識別符號的定義是對該識別符號的宣告: — 對于一個物件,導致為該物件保留存盤空間;
我想這與所有版本的 C 標準完全相同。
當我嘗試使用 GCC 編譯以下代碼時:
int main(void)
{ extern int myVariable; // Declaration of myVariable.
int myVariable; // Definition of myVariable.
int myVariable; // Definition of myVariable.
}
我收到以下錯誤:
錯誤:重新宣告沒有鏈接的“myVariable”
除非我弄錯了,否則錯誤不是重新定義嗎?
uj5u.com熱心網友回復:
首先你有這個:
extern int myVariable;
extern關鍵字使它成為具有外部鏈接的變數的宣告。任何此類宣告將始終參考同一個物件。
然后你有:
int myVariable;
此識別符號具有塊范圍(即在函式內部定義),因此沒有鏈接。因為它沒有鏈接,所以這樣的宣告也是一個定義。
這也是一個錯誤(盡管您沒有顯示它),因為您在同一范圍內對同一識別符號有沖突的宣告,一個具有外部鏈接,一個沒有鏈接。
然后在相同的范圍內:
int myVariable;
這是一個錯誤,因為您有兩個同名的物件,但在同一范圍內沒有鏈接,因此有多個定義。
C 標準的第 6.2.2p2 節更詳細地描述了鏈接:
在構成整個程式的一組翻譯單元和庫中,具有 外部鏈接的特定識別符號的每個宣告都表示相同的物件或函式。在一個翻譯單元中,具有內部鏈接的識別符號的每個宣告都表示相同的物件或函式。沒有鏈接的識別符號的每個宣告都表示一個唯一的物體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477683.html
上一篇:結構成員的地址是否定義了行為?
下一篇:如何洗掉字串中甚至出現的子字串
