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).
¿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
Por cierto, ¿estás seguro de que es '__POSIX' y no' _POSIX_C_SOURCE'? – oldrinb
Acabo de comprobar nuevamente y es ___USE_POSIX – dave