0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

请问头文件能不能定义变量呢?

学益得智能硬件 来源:学益得智能硬件 2024-04-28 09:33 次阅读

头文件里面能不能定义变量?

最近在编译一个工程的时候,突然遇到了变量重复定义的问题,根据提示打开这几个 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

原文标题:头文件能不能定义变量?

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言中结构体能不能相加

    C语言中,结构体能不能相加?
    的头像 发表于 12-19 17:04 888次阅读
    C语言中结构体<b class='flag-5'>能不能</b>相加

    PIC单片机能不能把IO口定义成一个变量

    PIC单片机能不能把IO口定义成一个变量,比如我要位操作RA0口,我在程序中用一个变量X来代替RA0,接下来程序中我只要修改X的值就能改变RA0口的输出状态.我用的是PICC编义器,我
    发表于 02-01 17:49

    共享变量能不能实现这种功能

    各位大神好,请问用labview能不能实现这样一种功能,在前面板中的按钮控制某一VI的运行,这一个VI的运行结果又返回到主VI,不知道用共享变量能不能实现。描述的不够清楚,勿怪,谢谢。
    发表于 12-30 09:52

    急求atmega128可定义变量类型,主要是看能不能定义32位的变量

    急求atmega128可定义变量类型,主要是看能不能定义32位的变量
    发表于 05-17 10:46

    请问能不能通过编程的方式进行自动仿真?

    大神们,因为要仿真的激励信号比较多,请问能不能通过编程的方式实现自动仿真,然后生成仿真结果文件
    发表于 03-13 10:08

    请问哪个系列的DSP的 C∕C++ 头文件和外设示例有PID控制的例程

    最近在做一个数字电源,需要用到PID控制输出电压的稳定。请问哪一个型号的DSP的C∕C++ 头文件和外设示例有PID控制程序?谢谢了。我在28XX系列的例程里面没有找到PID的例程。要是没有,能不能上传一份例程
    发表于 05-14 04:46

    头文件定义全局变量的方法

      教大家一个如何在头文件定义全局变量的方法  通常情况下,都是在C文件定义全局变量,在
    发表于 07-04 08:34

    头文件定义全局变量的方法介绍

      教大家一个如何在头文件定义全局变量的方法  通常情况下,都是在C文件定义全局变量,在
    发表于 07-09 09:25

    STM32能不能代替DSP

    为什么一定要DSP作为主控芯片?STM32能不能代替DSP?DSP与STM32有什么区别?
    发表于 10-20 06:24

    电池能不能修复?

    电池能不能修复? 电池修复作为一个新生事物,许多人对它不了解,也有许多人对它一知半解。那么电池到底能不能修复呢?
    发表于 11-23 10:40 1023次阅读

    教大家一个如何在头文件定义全局变量的方法

    通常情况下,都是在C文件定义全局变量,在头文件中声明,但是,如果我们定义的全局变量需要被很多的
    发表于 12-04 14:55 19次下载

    MCU_头文件编写

    头文件中一般放一些重复使用的代码,如:常量、变量、宏等的定义,函数的声明。当使用#include语句引用头头文件时,相当于将头文件中的内容复
    发表于 12-05 10:36 5次下载
    MCU_<b class='flag-5'>头文件</b>编写

    指针能不能作为循环变量

    指针能不能作为循环变量
    的头像 发表于 02-16 18:11 807次阅读

    功耗分析能不能再提前亿点点?

    ‍ ‍     原文标题:功耗分析能不能再提前亿点点? 文章出处:【微信公众号:新思科技】欢迎添加关注!文章转载请注明出处。
    的头像 发表于 04-13 22:50 290次阅读

    拼接屏能不能触屏操作?

    拼接屏能不能直接触屏操作,小编回答可以的,实际上很多客户购买拼接屏时都会提出拼接屏能不能加触摸的功能?我们回复是可以的,那是一种怎样的原理呢? 拼接屏一般是用来大屏展示,用来播放文字、图像等内容
    的头像 发表于 09-11 14:36 2226次阅读