LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 711|回复: 9

extern和static的关系

[复制链接]
发表于 2005-7-12 22:18:44 | 显示全部楼层 |阅读模式
用gcc4编译内核的时候,出现了这样一个错误
  1. drivers/video/vesafb-thread.c:40: 错误:对 ‘errno’ 的静态声明出现在非静态声明之后
  2. include/linux/unistd.h:4: 错误:‘errno’ 的上一个声明在此
  3. make[2]: *** [drivers/video/vesafb-thread.o] 错误 1
  4. make[1]: *** [drivers/video] 错误 2
  5. make: *** [drivers] 错误 2
复制代码


于是打开看看
include/linux/unistd.h第四行是:
extern int errno;

drivers/video/vesafb-thread.c的40行是:
static int              errno = 0;


我记得的这么写是对的,怎么回事了?
发表于 2005-7-12 23:15:17 | 显示全部楼层
errno应该是在errno.h中声明的呀
回复 支持 反对

使用道具 举报

发表于 2005-7-13 10:59:52 | 显示全部楼层
vesafb-thread.c 是你的文件吗?
回复 支持 反对

使用道具 举报

发表于 2005-7-13 12:17:41 | 显示全部楼层
按理说已经声明为static了,作用域就局限于本文件了
所以include/linux/unistd.h中的errno和drivers/video/vesafb-thread.c中的应该没关系
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-13 15:13:38 | 显示全部楼层
Post by 弥敦路九号
vesafb-thread.c 是你的文件吗?



不是我的文件,这个可能是gentoo补丁集中的实现fbsplash的文件。我没有修改
这个错误觉得很奇怪,不知是gcc4的bug还是新标准?
回复 支持 反对

使用道具 举报

发表于 2005-7-13 19:50:17 | 显示全部楼层
vesafb-thread.c中引用了头文件unistd.h了吗?
如果是这样的话,可以把vesafb-thread.c中的静态errno换一个名字。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-14 22:52:26 | 显示全部楼层
Post by kj501
vesafb-thread.c中引用了头文件unistd.h了吗?
如果是这样的话,可以把vesafb-thread.c中的静态errno换一个名字。


才注意到errno这个变量在这个文件中根本没有用到,注销掉之后这个错误就没有了,但仍然无法理解为什么会出现这样的错误。
回复 支持 反对

使用道具 举报

发表于 2005-7-15 01:09:34 | 显示全部楼层
Post by graydream
才注意到errno这个变量在这个文件中根本没有用到,注销掉之后这个错误就没有了,但仍然无法理解为什么会出现这样的错误。

如果没有include<unistd.h>的话,这个问题,就比较难解释了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-15 08:37:12 | 显示全部楼层
Post by pupilzeng
如果没有include<unistd.h>的话,这个问题,就比较难解释了



有的,但是既然声明为static了,应该就没有关系了吧?

现在这个文件不再手上,晚上回家贴出来
回复 支持 反对

使用道具 举报

发表于 2005-7-15 20:37:20 | 显示全部楼层
Post by graydream
才注意到errno这个变量在这个文件中根本没有用到,注销掉之后这个错误就没有了,但仍然无法理解为什么会出现这样的错误。

估计是errno这个变量名与glibc的全局变量重名造成的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表