免费注册 查看新帖 |

Chinaunix

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

使用extern声明来引用static变量 编译报错 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-23 15:48 |只看该作者 |倒序浏览
在文件结尾定义static变量 static int num; 在该文件之前如何引用这个变量呢? 在文件开头声明extern int num编译时报错!! 求解!

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2012-04-23 15:53 |只看该作者
都是闲得蛋疼的幸福人
你就不能把 static int num 放到使用它的代码之前?

论坛徽章:
0
3 [报告]
发表于 2012-04-23 15:56 |只看该作者
我就是想知道这种情况下该咋办啊。。
回复 2# bruceteen


   

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
4 [报告]
发表于 2012-04-23 16:01 |只看该作者
static + extern,我觉得这个组合实在是太有喜感了!
static要求去除符号表名称,extern要求通过符号名称链接,如果你是编译器,你说该咋办?

论坛徽章:
0
5 [报告]
发表于 2012-04-23 16:20 |只看该作者
本帖最后由 sanbiangongzi 于 2012-04-23 16:24 编辑
madope 发表于 2012-04-23 15:56
我就是想知道这种情况下该咋办啊。。
回复 2# bruceteen
  1. # cat a.c

  2. static int a;
  3. // your code
  4. static int a;
  5. # gcc -c -pedantic a.c -o a.o
  6. # readelf -S a.o
  7. There are 10 section headers, starting at offset 0xd8:

  8. Section Headers:
  9.   [Nr] Name              Type             Address           Offset
  10.        Size              EntSize          Flags  Link  Info  Align
  11.   [ 0]                   NULL             0000000000000000  00000000
  12.        0000000000000000  0000000000000000           0     0     0
  13.   [ 1] .text             PROGBITS         0000000000000000  00000040
  14.        0000000000000000  0000000000000000  AX       0     0     4
  15.   [ 2] .data             PROGBITS         0000000000000000  00000040
  16.        0000000000000000  0000000000000000  WA       0     0     4
  17.   [ 3] .bss              NOBITS           0000000000000000  00000040
  18.        0000000000000004  0000000000000000  WA       0     0     4
  19.   [ 4] .comment          PROGBITS         0000000000000000  00000040
  20.        000000000000003a  0000000000000001  MS       0     0     1
  21.   [ 5] .comment.SUSE.OPT PROGBITS         0000000000000000  0000007a
  22.        0000000000000006  0000000000000001  MS       0     0     1
  23.   [ 6] .note.GNU-stack   PROGBITS         0000000000000000  00000080
  24.        0000000000000000  0000000000000000           0     0     1
  25.   [ 7] .shstrtab         STRTAB           0000000000000000  00000080
  26.        0000000000000058  0000000000000000           0     0     1
  27.   [ 8] .symtab           SYMTAB           0000000000000000  00000358
  28.        00000000000000d8  0000000000000018           9     9     8
  29.   [ 9] .strtab           STRTAB           0000000000000000  00000430
  30.        0000000000000007  0000000000000000           0     0     1
  31. Key to Flags:
  32.   W (write), A (alloc), X (execute), M (merge), S (strings)
  33.   I (info), L (link order), G (group), x (unknown)
  34.   O (extra OS processing required) o (OS specific), p (processor specific)
  35. #
复制代码
static 变量在一个文件中定义两次没有问题

  [ 3] .bss              NOBITS           0000000000000000  00000040
       0000000000000004  0000000000000000  WA       0     0     4


出现这种情况,通常的用法是,如果该static变量的初始化要示用到本文件中的函数/变量来初始化
他被放到文件末尾,
但是在这些用于初始化它函数中又会被引用的话

static type var;

//your code

static type var = {init values};

Linux 内核中有很多这样的例子

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
6 [报告]
发表于 2012-04-23 16:28 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2012-04-23 18:22 |只看该作者
我试了一下 真的可以定义两次!! 但是不能对两处同时初始化, 意思就是说其中一次是定义,另一次相当于引用声明,不分配存储空间,是这样吗
回复 5# sanbiangongzi


   

论坛徽章:
0
8 [报告]
发表于 2012-04-23 18:24 |只看该作者
也是啊。。不了解编译原理--! 可是首先static int num; 然后在后面extern int num;这样编译就能通过, 这又是为啥啊!!
回复 4# w_anthony


   

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
9 [报告]
发表于 2012-04-23 18:46 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
10 [报告]
发表于 2012-04-23 18:56 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP