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

描述

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

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

头文件里面定义变量也跟编译器有关,同样的代码,换个编译器,链接的时候竟然没有问题。最后,还是建议大家,最好不要在头文件里面定义变量和函数。

 



审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分