作者boss0405 (boss)
看板C_and_CPP
標題Re: [問題] sturct/union extern後又定義 沒有問題?
時間Wed Jul 31 10:31:21 2019
※ 引述《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