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

作者: anoymouse (沒有暱稱)   2019-07-30 11:43:04
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; 不就會給記憶體區塊了嗎?
謝謝
作者: KaryuuIssen (一閃)   2019-07-30 11:46:00
作者: anoymouse (沒有暱稱)   2019-07-30 11:52:00
你貼的是變數的重複宣告而已 並沒有重複定義吧變數只要沒賦值都只是宣告 可是union只要下了就是定義還是我理解錯誤
作者: james732 (好人超)   2019-07-30 12:04:00
看起來跟我問的是同樣的問題 XD
作者: boss0405 (boss)   2019-07-30 14:55:00
你如果第二個定義給不同的初始值就會報error了
作者: anoymouse (沒有暱稱)   2019-07-30 15:27:00
我在之後的main裡面有給值 沒有error
作者: boss0405 (boss)   2019-07-30 16:34:00
是給初始值喔,你兩個定義都沒給初始值是合法的
作者: anoymouse (沒有暱稱)   2019-07-30 17:50:00
就是在定義的同時給初值才會掛?可是沒給初值不就預設都0嗎?剛剛試好像不會怎樣 等等再試試看
作者: boss0405 (boss)   2019-07-30 23:18:00
稍微再確認一下,應該是要兩個同時都給初始值才會掛
作者: anoymouse (沒有暱稱)   2019-07-30 23:49:00
好 明天會再確認 謝謝我剛剛用devC TDB-GCC 4.9.2試 大概就像你所說的要初始化 才會出現multi-definition但是我單晶片用的編譯器就不會有問題。但是如果不在宣告結構變數時就賦值,還是會給結構變數記憶體空間 然後成員內容會是0如果有extern 兩個c檔的同個結構變數就會是同一個記憶體空間 剛剛試的結果

Links booklink

Contact Us: admin [ a t ] ucptt.com