打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
一道华为面试题:全局变量可不可以定义在可被多个.c文件包含的头文件中?为什么?
userphoto

2011.05.24

关注
这个问题是偶尔在一个论坛中看到的,首先说一下这个问题的含义:
题目中所说的是定义而不是声明,也就不可能是extern的声明方式了,定义的话会有内存分配,如果这个头文件包含在多个.c文件中则涉及到重复定义,这样生成的obj文件中可能会有多个该全局变量的拷贝,这样连接的话可能报错。
这里没有说是不是static的全局变量,所以我们假设不是(如果可以static的话这个问题就没有意义了)。
按我的理解是不可以,声明和定义是两码事,按惯例, 变量和函数的定义都应该在.c文件中而不是.h文件中。但是这个问题只是问可不可以,网上很多人说可以,理由乱七八糟,有人说可以用宏来解决重复定义的问题,这个我就不懂了,宏是预编译指令,怎么解决连接时的错误呢?还有的人说只要不要再.h文件中给全局变量赋初值就可以,这个我也无法理解(他说在linux下gcc通过,所以我暂时无法尝试),请高手予以解答。
收藏分享
WHB_HD
阿波
九度论坛管理员
UID
1480
帖子
403
积分
1372
九度威望
221
九度贡献
728
目前职业
学生
就职企业
浙江大学
最后登录
2011-5-21
2楼
 发表于 2011-3-3 13:19 | 只看该作者 
我的理解和楼主类似。
1. 一般.h文件中是不定义的,只有声明,理由就是每个.c文件都会生成一个.obj文件,如果.h文件中有定义,那么就会有多个obj文件中有重复定义,最后链接的时候会出错。
比如://head.h
extern int g_var;/*说明g_var这个变量可能在别的编译单元内*/
//source1.c
#include "head.h"
int g_var; /*通过头文件得知g_var可能在别的编译单元内,但是这里有int g_var,那么g_var的定义就在本单元*/
//main.c
#include "head.h"
可以加extern int g_var,也可以不加
/*通过头文件得知g_var可能在别的编译单元内,编译时保留一个符号,链接的时候在其它单元内寻找*/
复制代码
500 字节以内
不支持自定义 Discuz! 代码
TOP
WHB_HD
阿波
九度论坛管理员
UID
1480
帖子
403
积分
1372
九度威望
221
九度贡献
728
目前职业
学生
就职企业
浙江大学
最后登录
2011-5-21
3楼
 发表于 2011-3-3 13:45 | 只看该作者 
2. 我试了一下在gcc下,楼主说的情况可以编译,为什么我也不知道。
PS:这题的答案是可以,也可以是不可以,说出自己的理由即可。网上还有人说可以钻空子,用#ifdef来定义,当然,.c中也要相应的配合
500 字节以内
不支持自定义 Discuz! 代码
TOP
无为
无为
九度论坛超级版主
UID
16543
帖子
827
积分
1732
九度威望
305
九度贡献
708
目前职业
学生
就职企业
浙江大学
最后登录
2011-5-22
4楼
 发表于 2011-3-3 14:55 | 只看该作者 
本帖最后由 无为 于 2011-3-3 16:10 编辑
问题一:关于宏这个的确是可以解决重复定义问题,下面这段代码就可以避免一些变量被重复定义。
#ifndef MAX
#define MAX
..../*定义一些你要定义的变量*/
#endif
复制代码
问题二:在.h文件中定义全局变量但不初始化,这样可以编译通过,那是因为没有初始化的全局变量是弱符号,初始化后是强符号
不过一般不推荐在.h文件中定义变量!
上善若水
TOP
无为
无为
九度论坛超级版主
UID
16543
帖子
827
积分
1732
九度威望
305
九度贡献
708
目前职业
学生
就职企业
浙江大学
最后登录
2011-5-22
5楼
 发表于 2011-3-3 16:10 | 只看该作者 
在程序员的自我修养P92页有,关于强符号和弱符号
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
全局变量与局部变量
Delphi?:?定义在implementation前后的全局变量有什么区别?
能说明你的Javascript技术很烂的五个原因
delphi 定义全局变量
ELF格式与bss段
C语言中的强符号与弱符号
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服