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