2012-08-19 11 views
15

Tengo el siguiente código que estaba intentando compilar. Cuando probé con std = c99 falló con advertencias sobre "declaración implícita de tipo struct addrinfo" y "implicit declaration of function getaddrinfo". Funciona con std = gnu99.¿Por qué no se puede encontrar getaddrinfo al compilar con gcc y std = c99

#include <sys/types.h> 
#include <sys/socket.h> 
#include <netdb.h> 

int fails(const char *host, const char *port, struct addrinfo *hints) 
{ 
     int rc; 
     struct addrinfo *results; 

     // can't find this function?? 
     rc = getaddrinfo(host, port, hints, &results); 

     // free memory in this important application 
     freeaddrinfo(results); 

     return rc; 
} 

Los comandos que utiliza para compilar es:

gcc -c -o fail.o -Wall -Werror -std=c99 -save-temps fail.c 
gcc -c -o fail.o -Wall -Werror -std=gnu99 -save-temps fail.c 

En cuanto a fail.i (cabecera preprocesado) veo que el compilador tiene razón: esos tipos no han sido declarados en las cabeceras tirado en

Así que fui a los encabezados y noté que getaddrinfo está rodeado por un protector #ifdef __USE_POSIX, que obviamente no está declarado al compilar con c99.

¿Cómo le digo a gcc que quiero usar c99 y POSIX? Realmente no quiero usar gnu99 en caso de que decida cambiar los compiladores más tarde (por ejemplo, Clang o icc).

+0

¿Ha intentado gcc -c -ofail.o - Wall -Werror -std = c99 -D__POSIX -save-temps fail.c'? Eso o hacer un punto para '#define __POSIX' en la parte superior de' fail.c'. – oldrinb

+0

Por cierto, ¿estás seguro de que es '__POSIX' y no' _POSIX_C_SOURCE'? – oldrinb

+0

Acabo de comprobar nuevamente y es ___USE_POSIX – dave

Respuesta

Cuestiones relacionadas