Chinaunix

标题: mingw里可恶的errno!!! [打印本页]

作者: nully    时间: 2006-10-19 03:11
标题: mingw里可恶的errno!!!
遇到这个问题已经八个小时了,现在终于要被解决。。。

对于自己程序自定义的错误系统,总会有错误号要传递,形参名字自然而然就是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!!
作者: nully    时间: 2006-10-19 03:16
最后总结出原来改个变量名就可以解决这么重大的问题。。。
作者: langue    时间: 2006-10-19 05:05
呵呵,这就是 MinGW。改 Cygwin 吧。和它比起来,MinGW 就像玩具。
作者: prc    时间: 2006-10-19 09:15
把程序贴出来看看?借鉴一下?
作者: nully    时间: 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. }
复制代码


这是代码。。。。。真是汗啊。。。搞得我整夜没睡。。。
作者: nully    时间: 2006-10-19 13:53
移植一些小东西而已,通常不会有太多unix的东西,用mingw足矣。
作者: delimy    时间: 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.
作者: lenovo    时间: 2006-10-19 15:25
这个问题和mingw没关系,
具体解释看楼上。
作者: langue    时间: 2006-10-19 18:46
问题就是,有的系统上是宏定义,有的直接用符号了。
作者: whyglinux    时间: 2006-10-19 19:22
在程序中包含标准库的头文件(如<stdio.h>)会导致引入 errno 标识符,它是一个保留的标识符。根据标准的规定,在使用了 C 标准库的程序中声明或者定义这个标识符是未定义行为。因此问题出在上面写的程序中,而不是 MinGW 的问题—— MinGW 中如此定义 errno 是符合标准的。
作者: F.D.Roosevelt    时间: 2006-10-19 19:35
同意 7 楼和 10 楼




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2