头文件里面能不能定义变量?
最近在编译一个工程的时候,突然遇到了变量重复定义的问题,根据提示打开这几个 C 文件,并没有发现定义变量的地方。后来再找一找,原来变量定义在了头文件里面。
结论就是,头文件里面可以定义变量,但是最好不要定义。
写个 demo 看一下。头文件里面定义变量 num,1.c包含头文件,并且输出 num 的值。2.c也包含头文件,同样也输出 num 的值。代码结构很简单。
再写个 Makefile,方便看到编译的步骤。
执行 make 的时候,从 1.c 变成 1.o 没有问题,2.c 变成 2.o 也没有问题,但是最后一步链接的时候,提示 num 重复定义。
为什么会这样。我们知道编译的第一步是预处理,所有的头文件都会被展开,比如 1.c ,预处理后变成了这样,num 的定义直接被搬到了 C 文件里面。同理,2.c 被预处理后,里面也多了个 num 的定义。所以最后一步链接的时候,编译器就提示 num 重复定义。
解决这个问题方法有很多,比如定义 num 的时候,加上 static,限制它的作用域,或者干脆不要在头文件里面定义变量,把它放到源文件中,如果其他文件需要访问,用 extern 声明一下。
头文件里面定义变量也跟编译器有关,同样的代码,换个编译器,链接的时候竟然没有问题。最后,还是建议大家,最好不要在头文件里面定义变量和函数。
审核编辑:刘清
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
原文标题:头文件能不能定义变量?
文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。
相关推荐
C语言中,结构体能不能相加?
发表于 12-19 17:04
•1204次阅读
非 OS SDK 在中断处理函数中,请勿使用任何 ICACHE_FLASH_ATTR 定义的函数。
请问:
1、定时器和hw定时器的回调函数是否在中断处理函数里面被调用。定时器回调函数能不能调用
发表于 07-22 06:33
PIC单片机能不能把IO口定义成一个变量,比如我要位操作RA0口,我在程序中用一个变量X来代替RA0,接下来程序中我只要修改X的值就能改变RA0口的输出状态.我用的是PICC编义器,我
发表于 02-01 17:49
各位大神好,请问用labview能不能实现这样一种功能,在前面板中的按钮控制某一VI的运行,这一个VI的运行结果又返回到主VI,不知道用共享变量能不能实现。描述的不够清楚,勿怪,谢谢。
发表于 12-30 09:52
急求atmega128可定义变量类型,主要是看能不能定义32位的变量
发表于 05-17 10:46
最近在做一个数字电源,需要用到PID控制输出电压的稳定。请问哪一个型号的DSP的C∕C++ 头文件和外设示例有PID控制程序?谢谢了。我在28XX系列的例程里面没有找到PID的例程。要是没有,能不能上传一份例程
发表于 05-14 04:46
教大家一个如何在头文件中定义全局变量的方法 通常情况下,都是在C文件中定义全局变量,在
发表于 07-04 08:34
教大家一个如何在头文件中定义全局变量的方法 通常情况下,都是在C文件中定义全局变量,在
发表于 07-09 09:25
电池能不能修复?
电池修复作为一个新生事物,许多人对它不了解,也有许多人对它一知半解。那么电池到底能不能修复呢?
发表于 11-23 10:40
•1085次阅读
通常情况下,都是在C文件中定义全局变量,在头文件中声明,但是,如果我们定义的全局变量需要被很多的
发表于 12-04 14:55
•19次下载
谐波治理到底能不能节电?”这是我们做电能质量行业经常会被问到的一个问题。随着国家对节能减排项目的大力支持,有不少商业人士一拥而上加入到节能行业,想要分得节能市场的一杯羹。那么,通过谐波治理到底能不能实现节能的效果呢?
发表于 04-23 15:50
•3481次阅读
头文件中一般放一些重复使用的代码,如:常量、变量、宏等的定义,函数的声明。当使用#include语句引用头头文件时,相当于将头文件中的内容复
发表于 12-05 10:36
•5次下载
大型辊压机轴磨损能不能现场维修?
发表于 06-23 15:35
•1次下载
指针能不能作为循环变量?
发表于 02-16 18:11
•1007次阅读
物联网流量卡到底能不能用?
发表于 08-28 09:40
•6182次阅读
评论