作者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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1564540283.A.DF3.html
※ 编辑: boss0405 (59.124.166.19 台湾), 07/31/2019 10:32:17
1F:推 anoymouse: 有一篇混沌四神 有说到在c里面宣告就是定义 07/31 14:48
2F:→ anoymouse: 宣告可以无限次 定义只能一次 07/31 14:49
3F:→ anoymouse: 但是没有提到tentative definition, 谢谢 07/31 14:50