Ich habe den folgenden Code, den ich kompilieren wollte. Als ich mit std = c99 versuchte, scheiterte es mit Warnungen über "implizite Deklaration des Typs struct addrinfo" und "implizite Deklaration der Funktion getaddrinfo". Es funktioniert mit Std = gnu99.Warum kann getaddrinfo nicht gefunden werden, wenn mit gcc und std = c99 kompiliert
#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;
}
Die Befehle, die ich verwendet, um zu kompilieren ist:
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
bei fail.i Blick (vorverarbeitet Header) Ich sehe, dass Compiler ist richtig: diese Typen nicht in den Headern gezogen erklärt worden in
Also ging ich zu den Kopfzeilen und bemerkte, dass getaddrinfo von einem Wächter #ifdef __USE_POSIX umgeben ist, was offensichtlich nicht erklärt wird, wenn mit c99 kompiliert wird.
Wie kann ich gcc mitteilen, dass ich c99 und POSIX verwenden möchte? Ich möchte gnu99 nicht wirklich verwenden, wenn ich mich dazu entscheide, später Compiler zu wechseln (zB Clang oder ICC).
Haben Sie versucht, gcc -c -ofail.o - Wall -Werror -std = c99 -D__POSIX -save-temps fail.c'? Das oder ein Punkt auf '#define __POSIX' am Anfang von' fail.c'. – oldrinb
Übrigens, bist du sicher, dass es '__POSIX' und nicht' _POSIX_C_SOURCE' ist? – oldrinb
Ich habe es noch einmal überprüft und es ist ___USE_POSIX – dave