我已閱讀關於SO上的外部/內部鏈接的現有問題。我的問題不同 - 如果我在C
和C++
的不同翻譯單元中使用外部鏈接對同一變量進行多重定義,會發生什麼情況?C和C++之間的鏈接差異?
例如:
/*file1.c*/
typedef struct foo {
int a;
int b;
int c;
} foo;
foo xyz;
/*file2.c*/
typedef struct abc {
double x;
} foo;
foo xyz;
使用開發 - C++和作爲一個C程序,上述程序編譯和鏈接完美;而如果將其編譯爲C++程序,則會出現多重定義錯誤。爲什麼它應該在C下工作,C++有什麼區別?這種行爲是未定義的還是編譯器依賴的?這段代碼有多「壞」,如果我想重構它,我該怎麼做(我遇到過很多這樣寫的舊代碼)?
的C行爲可能是您實現真正的,但它不是由語言保證。 – 2010-01-08 08:34:08
變量名稱只是內存地址的標籤。如果您提供了兩種關於如何解釋該標籤的定義,那麼這並不奇怪地使標籤引用兩個不同的對象。 你有沒有看過一個鏈接器會有不同的表現? – 2010-01-08 08:50:41
我不否認這是通常的鏈接器行爲,這種行爲被其他語言和許多C實現使用。然而,你的回答意味着它是一個明確定義的行爲。根據C標準附錄J,允許在程序中使用多個外部定義是一種常見的擴展,但即使使用此擴展,如果定義不一致,則會導致未定義的行爲。 – 2010-01-08 10:26:54