这个问题是偶尔在一个论坛中看到的,首先说一下这个问题的含义:
题目中所说的是定义而不是声明,也就不可能是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! 代码
TOPWHB_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页有,关于强符号和弱符号
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。