[C con Clase] Problemas con variable errno

Carlos decvt100 en gmail.com
Jue Mayo 16 15:22:39 CEST 2013


El 15 de mayo de 2013 13:26, Salvador Pozo <salvador en conclase.net> escribió:

> 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. :)
>

Buenas Salvador,

No he notado diferencia declarando la variable como extern int errno o sin
hacerlo pero eso puede ser por la implementación como bien apuntabas.

Por otro lado, el problema real era el utilizar otras llamadas a funciones,
que aunque en la documentación no digan nada de que modifican la variable
errno, ésta si puede ser modificada.

Gracias por tu tiempo y ayuda.

Saludos.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20130516/19d80e1e/attachment.html>


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