Re: [問題] sturct/union extern後又定義 沒有問題?

作者: boss0405 (boss)   2019-07-31 10:31:21
※ 引述《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的錯誤。
作者: anoymouse (沒有暱稱)   2019-07-31 14:48:00
有一篇混沌四神 有說到在c裡面宣告就是定義宣告可以無限次 定義只能一次但是沒有提到tentative definition, 謝謝

Links booklink

Contact Us: admin [ a t ] ucptt.com