<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">El 15 de mayo de 2013 13:26, Salvador Pozo <span dir="ltr"><<a href="mailto:salvador@conclase.net" target="_blank">salvador@conclase.net</a>></span> escribió:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hola:<br>
<br>
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".<br>
<br>
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.<br>
<br>
Por ejemplo, en la versión de MinGW que estoy usando, errno está declarado de este modo:<br>
<br>
----8<------<br>
 1: #ifdef      __cplusplus<br>
 2: extern "C" {<br>
 3: #endif<br>
 4: #ifdef _UWIN<br>
 5: #undef errno<br>
 6: extern int errno;<br>
 7: #else<br>
 8: _CRTIMP int* __cdecl __MINGW_NOTHROW _errno(void);<br>
 9: #define     errno           (*_errno())<br>
10: #endif<br>
11: #ifdef      __cplusplus<br>
12: }<br>
13: #endif<br>
----8<------<br>
<br>
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).<br>
<br>
En este segundo caso, si tu has declarado errno en tu programa, su valor puede ser diferente, dependiendo de cómo sea consultado.<br>
<br>
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.<br>
<br>
Del manual de unix (<a href="http://unixhelp.ed.ac.uk/CGI/man-cgi?errno+3" target="_blank">http://unixhelp.ed.ac.uk/CGI/man-cgi?errno+3</a>):<br>
<br>
----8<------<br>
       errno is defined by the ISO C standard to be  a  modifiable  lvalue  of<br>
       type  int,  and  must not be explicitly declared; errno may be a macro.<br>
       errno is thread-local; setting it in one thread  does  not  affect  its<br>
       value in any other thread.<br>
----8<------<br>
<br>
Ya nos contarás qué tal. :)<br></blockquote><div><br></div><div>Buenas Salvador,<br><br></div><div>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.<br>
<br>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.<br><br></div><div>Gracias por tu tiempo y ayuda.<br>
<br>Saludos. <br></div></div></div></div>