看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《anoymouse (沒有暱稱)》之銘言: : win10 : compiler: Microchip xc8 : In the header File: : typedef union : { : uint8_t Bytes[4]; : uint32_t Word; : }BYTES_TO_WORD; : extern BYTES_TO_WORD MyBytes; : In the 'C' File with the declairation in it : #include "commonheaderfile.h" : BYTES_TO_WORD MyBytes; : in other 'C' files : #include "commonheaderfile.h" : MyBytes.Word=123445677; : 上述這樣是正常運作,結果我不小心在other 'C' file也下了BYTES_TO_WORD MyBytes; : 編譯還是過,運作也沒問題,奇怪這樣不是重複定義? : BYTES_TO_WORD MyBytes; 不就會給記憶體區塊了嗎? : 謝謝 針對個個問題又再稍微仔細翻了一下相關定義,想說直接回文比較清楚, 若有理解錯誤的地方再請各位大大指教。 先給出個大前提,以下的討論僅針對C,C++是個不同的世界。 要理解為什麼有這行為首先要知道什麼是tentative definition,它代 表的是當你在函式外宣告物件,而且沒有給任何的初始值時,此宣告即為 tentative definition,如果遇到同樣的定義,那就會都被視為相同的 宣告,若沒有其他明確的定義存在,編譯器最後會將此tentative definition 加上初始值為0的設定。 因此你才會看到在都沒宣告初始值的狀況下是可以重複定義的,而如果其中 一個定義給了初始值,則會賦予此初始值,如果都沒有給初始值那編譯器就 會給0為初始值。 但如果有多個定義都給了初始值那則會是個undefined behavior,這就視編譯 器如何實作,大部分的是會直接報multiple definition的錯誤。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.124.166.19 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1564540283.A.DF3.html ※ 編輯: boss0405 (59.124.166.19 臺灣), 07/31/2019 10:32:17
anoymouse: 有一篇混沌四神 有說到在c裡面宣告就是定義 07/31 14:48
anoymouse: 宣告可以無限次 定義只能一次 07/31 14:49
anoymouse: 但是沒有提到tentative definition, 謝謝 07/31 14:50