即使用了#ifndef…… #define的方式,头文件中定义变量还是会报错重复定义,为何?

bandaoyu 2019-12-16 09:23:40


头文件myData.h中定义


#ifndef __MY_DATA__
#define __MY_DATA__

struct __stMyData {
uint64_t lat; //纬度
uint64_t longit; //经度
}myData[] = {
{ 229275507430 , 1132741961720 },
{ 229275506920 , 1132741962120 },
{ 229275506930 , 1132741962120 },
{ 229275506630 , 1132741962280 }}



#endif


即使使用了#ifndef __MY_DATA__ #define __MY_DATA__ 但是只要两个源文件同时包含这个头文件就会报重复定义错误,这是为什么?既然已经#ifndef __MY_DATA__ 那定义的语段照理说不应该重复编译呀? 请了解的大神解答
...全文
853 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
oria2006 2019-12-16
  • 打赏
  • 举报
回复 1
这个宏定义主要 防止一个头文件在同一个源文件中被调用多次的情况,一般情况下谁也不会include同一个文件多次,主要是防止头文件嵌套时两个不同文件,引用了同一个头文件
铖邑 2019-12-16
  • 打赏
  • 举报
回复
多个文件包含这个头文件的时候,每个文件都只进入该头文件一次而已,但是每次都会定义一个全局变量,这样同一个变量名存在多个文件中定义成全局变量,产生冲突。请记住,不要在头文件里面定义全局变量!甚至不要在头文件里面定义任何变量!
bandaoyu 2019-12-16
  • 打赏
  • 举报
回复
引用 2 楼 SuperDay 的回复:
不能在头文件里面定义全局变量,这也是规则之一

既然已经#ifndef __MY_DATA__ 那定义的语段照理说不应该重复编译呀?
铖邑 2019-12-16
  • 打赏
  • 举报
回复 1
不能在头文件里面定义全局变量,这也是规则之一
铖邑 2019-12-16
  • 打赏
  • 举报
回复
因为你在里面定义了全局变量啊
铖邑 2019-12-16
  • 打赏
  • 举报
回复 2
include的功能只是合并文件,理解了这一点就很容易明白了,有多少个c或者cpp文件,最后都会合并成多少个大的文件,然后一个个编译,如果多个文件包含了你这头文件,最后合并出来的大文件里面都会有这个定义的全局变量,编译的的时候不会出错,但是链接时候就会报错的
bandaoyu 2019-12-16
  • 打赏
  • 举报
回复
引用 8 楼 oria2006 的回复:
[quote=引用 7 楼 bandaoyu 的回复:]
[quote=引用 5 楼 oria2006 的回复:]
所噶!! 原来如此,太感谢了
oria2006 2019-12-16
  • 打赏
  • 举报
回复 1
引用 7 楼 bandaoyu 的回复:
[quote=引用 5 楼 oria2006 的回复:]
这个宏定义主要 防止一个头文件在同一个源文件中被调用多次的情况,一般情况下谁也不会include同一个文件多次,主要是防止头文件嵌套时两个不同文件,引用了同一个头文件


哦哦,那如果一个文件(A.c)进入该头文件myData.h一次 执行#ifndef __MY_DATA__ ,#define __MY_DATA__ 之后,后面的文件(B.c)判断#ifndef __MY_DATA__ 就是false,B.c还会再进入myData.h 再执行定义变量的语句一次?。 见笑了,还望帮忙解惑一下[/quote]


假设有两个文件a.c b.c 这两个文件都包含同一个头文件,编译器独立编译a.c和b.c,两者没什么关联性,分别生成a.o b.o,之后会链接,这时候才会发现a.o和b.o都定义了同一个变量,所以报错。
bandaoyu 2019-12-16
  • 打赏
  • 举报
回复
引用 5 楼 oria2006 的回复:
这个宏定义主要 防止一个头文件在同一个源文件中被调用多次的情况,一般情况下谁也不会include同一个文件多次,主要是防止头文件嵌套时两个不同文件,引用了同一个头文件


哦哦,那如果一个文件(A.c)进入该头文件myData.h一次 执行#ifndef __MY_DATA__ ,#define __MY_DATA__ 之后,后面的文件(B.c)判断#ifndef __MY_DATA__ 就是false,B.c还会再进入myData.h 再执行定义变量的语句一次?。 见笑了,还望帮忙解惑一下
bandaoyu 2019-12-16
  • 打赏
  • 举报
回复
引用 4 楼 SuperDay 的回复:
多个文件包含这个头文件的时候,每个文件都只进入该头文件一次而已,但是每次都会定义一个全局变量,这样同一个变量名存在多个文件中定义成全局变量,产生冲突。请记住,不要在头文件里面定义全局变量!甚至不要在头文件里面定义任何变量!


不太理解 既然已经#ifndef __MY_DATA__ ,为什么每个文件还能进入该文件一次,前一个文件执行了#define __MY_DATA__ 之后,后面的文件判断#ifndef __MY_DATA__ 不就是false,不就不会再进入了么,为什么还能进去了。 见笑了,还望帮忙解惑一下

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧