免费注册 查看新帖 |

Chinaunix

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

mingw里可恶的errno!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-10-19 03:11 |只看该作者 |正序浏览
遇到这个问题已经八个小时了,现在终于要被解决。。。

对于自己程序自定义的错误系统,总会有错误号要传递,形参名字自然而然就是errno。。
理所当然是没有问题。。。但如果出现在回调函数,并且是使用win下的mingw的话,那就要小心了。。。

errno居然是这样定义的!!!
#ifdef _UWIN
#undef errno
extern int errno;
#else
_CRTIMP int* __cdecl        _errno(void);
#define        errno                (*_errno())
#endif
_CRTIMP int* __cdecl        __doserrno(void);
#define        _doserrno        (*__doserrno())

花了八个小时用gcc 3.4硬是没找出什么错误,最终使用g++试了一下,因为g++检查上比较严格一些。。。
总是莫名奇妙的出现:

error.c:295: error: invalid conversion from `long int' to `long int*(*)()'

我拷,long int*(*)()是啥玩意!!!
TNNDDDDDDDDDDDDDDDD!!

论坛徽章:
0
11 [报告]
发表于 2006-10-19 19:35 |只看该作者
同意 7 楼和 10 楼

论坛徽章:
0
10 [报告]
发表于 2006-10-19 19:22 |只看该作者
在程序中包含标准库的头文件(如<stdio.h>)会导致引入 errno 标识符,它是一个保留的标识符。根据标准的规定,在使用了 C 标准库的程序中声明或者定义这个标识符是未定义行为。因此问题出在上面写的程序中,而不是 MinGW 的问题—— MinGW 中如此定义 errno 是符合标准的。

论坛徽章:
0
9 [报告]
发表于 2006-10-19 18:46 |只看该作者
问题就是,有的系统上是宏定义,有的直接用符号了。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2006-10-19 15:25 |只看该作者
这个问题和mingw没关系,
具体解释看楼上。

论坛徽章:
0
7 [报告]
发表于 2006-10-19 14:28 |只看该作者
楼主的理所当然真是奇怪。
man errno:
errno is defined by the ISO C standard to be  a  modifiable  lvalue  of
type  int,  and  must *not* be explicitly declared; errno may be a macro.
errno is thread-local; setting it in one thread  does  not  affect  its
value in any other thread.

论坛徽章:
0
6 [报告]
发表于 2006-10-19 13:53 |只看该作者
移植一些小东西而已,通常不会有太多unix的东西,用mingw足矣。

论坛徽章:
0
5 [报告]
发表于 2006-10-19 13:50 |只看该作者

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. static void (*__callback)(long errno) = NULL;

  4. void set_callback(void (*callback)(long errno)) {
  5.     __callback = callback;
  6. }

  7. void my_callback(long errno) {
  8.      printf("error number is: %d\n", errno);
  9. }


  10. void run_it(long errno) {
  11.     if(__callback) (*__callback)(errno);
  12. }

  13. int main() {
  14.     set_callback(my_callback);
  15.     run_it(5);
  16.     return 0;
  17. }
复制代码


这是代码。。。。。真是汗啊。。。搞得我整夜没睡。。。

论坛徽章:
0
4 [报告]
发表于 2006-10-19 09:15 |只看该作者
把程序贴出来看看?借鉴一下?

论坛徽章:
0
3 [报告]
发表于 2006-10-19 05:05 |只看该作者
呵呵,这就是 MinGW。改 Cygwin 吧。和它比起来,MinGW 就像玩具。
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP