头文件里面能不能定义变量?
最近在编译一个工程的时候,突然遇到了变量重复定义的问题,根据提示打开这几个 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 声明一下。
头文件里面定义变量也跟编译器有关,同样的代码,换个编译器,链接的时候竟然没有问题。最后,还是建议大家,最好不要在头文件里面定义变量和函数。
审核编辑:刘清
-
变量
+关注
关注
0文章
599浏览量
28174 -
头文件
+关注
关注
0文章
23浏览量
9807
原文标题:头文件能不能定义变量?
文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
PIC单片机能不能把IO口定义成一个变量
共享变量能不能实现这种功能呢
请问哪个系列的DSP的 C∕C++ 头文件和外设示例有PID控制的例程呢?
MCU_头文件编写
![MCU_<b class='flag-5'>头文件</b>编写](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
评论