[C con Clase] Problemas con variable errno

Salvador Pozo salvador en conclase.net
Mie Mayo 15 13:26:44 CEST 2013


Hola:

Por lo que he podido entender, se desaconseja muy seriamente declarar errno como una variable entera externa. En su lugar, basta con incluir el fichero de cabecera "errno.h".

El motivo es que errno puede ser una macro, de hecho, he mirado el fichero "errno.h" y en algunos casos así es, por lo tanto, el código que usas puede que no haga exactamente lo que estás pensando.

Por ejemplo, en la versión de MinGW que estoy usando, errno está declarado de este modo:

----8<------
 1: #ifdef	__cplusplus
 2: extern "C" {
 3: #endif
 4: #ifdef _UWIN
 5: #undef errno
 6: extern int errno;
 7: #else
 8: _CRTIMP int* __cdecl __MINGW_NOTHROW _errno(void);
 9: #define	errno		(*_errno())
10: #endif
11: #ifdef	__cplusplus
12: }
13: #endif
----8<------

Así, si la macro _UWIN existe, errno se declara como extern int (6), pero en caso contrario es un puntero a una función (9).

En este segundo caso, si tu has declarado errno en tu programa, su valor puede ser diferente, dependiendo de cómo sea consultado.

Yo probaría a seguir las recomendaciones, y eliminaría de declaración de errno como extern int en tu programa, a ver qué pasa.

Del manual de unix (http://unixhelp.ed.ac.uk/CGI/man-cgi?errno+3):

----8<------
       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.
----8<------

Ya nos contarás qué tal. :)

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase