[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