[C con Clase] Problemas con variable errno

Carlos decvt100 en gmail.com
Mie Mayo 15 12:50:12 CEST 2013


El 15 de mayo de 2013 12:19, Carlos <decvt100 en gmail.com> escribió:

> El 14 de mayo de 2013 16:04, Salvador Pozo <salvador en conclase.net>escribió:
>
>> Hola, Carlos:
>>
>> A ver si puede responderte alguien que pueda probarlo bajo linux. Yo he
>> probado en Windows y no puedo reproducir el error, errno siempre vale 17,
>> independientemente de que comente o no la línea "perror". Bueno, siempre
>> menos la primera vez, claro. :)
>>
>> Hasta pronto.
>>
>
Buenas Salvador,

Creo que ya se donde está el problema. Aunque en la documentación de printf
no dice nada, parece ser que puede pasar que cambie la variable de errno.

 A common mistake is to do

           if (somecall() == -1) {
               printf("somecall() failed\n");
               if (errno == ...) { ... }
           }

       where errno no longer needs to have the value it had upon return from
       somecall() (i.e., it may have been changed by the printf(3)).  If the
       value of errno should be preserved across a library call, it must be
       saved:

http://man7.org/linux/man-pages/man3/errno.3.html

Ojeando esta página he visto un parrafo que me ha hecho dudar:

It was common in traditional C to declare errno manually (i.e.,
       extern int errno) instead of including <errno.h>.  Do not do this.
       It will not work with modern versions of the C library.  However, on
       (very) old UNIX systems, there may be no <errno.h> and the
       declaration is needed.

Por ahora, siempre que quería meter variables globales declaradas en otros
ficheros utilizaba extern variable. No me queda claro si se refieren a que
SÓLO hay que introducir el fichero errno.h sin declarar en ningún otro
fichero fuente la variable extern int errno o que hay que utilizar el
include y el extern int.

Es decir, quizá ahí cuando hablan de antiguamente se refieren a que no
incluían el fichero errno.h más que quejarse de que declarasen la variable
como extern(es decir, incluir el fichero Y declarar extern int errno).

Sabes algo sobre este tema?

Gracias.

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


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