免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 12781 | 回复: 17
打印 上一主题 下一主题

[C] 如何定义全局变量 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-02 04:59 |只看该作者 |倒序浏览
本帖最后由 jack9981 于 2014-09-02 10:50 编辑

头文件: a.h
源代码 : a1.c  a2.c ... an.c;  n>=1, 即 源代码文件可能只有一个a1.c, 也可能有多个。
如何在a.h中定义一个全局变量g,其作用域能横跨a1.c ... an.c ; 限制如下:
*.  限制a1.c a2.c ... an.c, 只能在第一行#include "a.h"; 即在include a.h之前不能有任何其他代码。
*.  限制g只能在a.h中定义
*.  限制只能用如下编译方法:
gcc -c a1.c  -o  a1.o
...      
gcc -c an.c  -o  an.o
gcc  -o a.exe    a1.o ... an.o
*. 限制将以上的gcc,改为g++, 也能编译成功。

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
2 [报告]
发表于 2014-09-02 06:43 来自手机 |只看该作者
a.h
extern int g;

a1.c
#include "a.h"
int g;

an.c
#include "a.h"

论坛徽章:
0
3 [报告]
发表于 2014-09-02 09:12 |只看该作者
多文件生效,用extern。
限定只在本文件内生效,用static。
谭的书上就有。

论坛徽章:
0
4 [报告]
发表于 2014-09-02 09:47 |只看该作者
cobras 发表于 2014-09-02 06:43
a.h
extern int g;


/* 翻译一下 */
a.h
extern int g; /* 变量声明,可以出现多次 */

a1.c
#include "a.h" /* a1.c也可以不包含a.h,  int g所在行之后的代码也可以引用g */
int g; /* 没extern,是变量定义,必须出现且只能出现一次,所以在an.c中就没有 */


an.c
#include "a.h" /* an.c不提供g的定义,若要访问g, 必须包含a.h以获得g的声明*/

/*你们起的真早*/

论坛徽章:
0
5 [报告]
发表于 2014-09-02 10:48 |只看该作者
dooqaqa 发表于 2014-09-02 09:47
/* 翻译一下 */
a.h
extern int g; /* 变量声明,可以出现多次 */


题目的要求g只能在a.h中定义,而非声明


论坛徽章:
0
6 [报告]
发表于 2014-09-02 11:21 |只看该作者
jack9981 发表于 2014-09-02 10:48
题目的要求g只能在a.h中定义,而非声明

这种要依赖于编译器的选项,比如vc的__declspec (selectany)

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
7 [报告]
发表于 2014-09-02 11:29 |只看该作者
利用unix下编译器的一个特性,头文件中定义的时候不做初始化,这样链接的时候链接器就可以合并多个定义。

关键是为什么要这么做,有何意义?

论坛徽章:
0
8 [报告]
发表于 2014-09-02 11:31 |只看该作者
回复 5# jack9981
抱歉,原帖没仔细看,原来是道题.
实力比较差,我连考点都不太能看出来。
非要猜的话大概是考强弱符号吧,就是在头文件定义变量,同时指定为弱符号,能不能编过就不知道了
gcc下是 __attribute__((weak))


   

论坛徽章:
0
9 [报告]
发表于 2014-09-02 14:02 |只看该作者
"限制g只能在a.h中定义 "
学习C语言的目的何在? 限定算法最快是有意义的
但限定变量在.h定义......

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:032015年亚洲杯之中国
日期:2015-04-22 15:52:45
10 [报告]
发表于 2014-09-02 14:51 |只看该作者
本帖最后由 hanxin83 于 2014-09-02 15:00 编辑

原来是脑袋急转弯类的题目, 改一下... ...

  1. -----------------------------------------------------
  2. global.h
  3. =============================
  4. #ifndef __GLOBAL__
  5. #define __GLOBAL__  extern
  6. #else
  7. #undef GLOBAL
  8. #define GLOBAL
  9. #endif

  10. GLOBAL uint32_t gVar1;
  11. GLOBAL uint32_t gVar2;

  12. -----------------------------------------------------
  13. a1.c
  14. =============================
  15. #include "global.h"
  16. #include "global.h"
  17. ... ...

  18. -----------------------------------------------------
  19. a2.c
  20. =============================
  21. #include "global.h"
  22. ... ...
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP