Ответ 1
Просто потому, что getaddrinfo
(расширение POSIX.1g) не является частью стандартного c99:
http://www.schweikhardt.net/identifiers.html
Оставайтесь с -std=gnu99
или -D_POSIX_C_SOURCE=200112L
У меня есть следующий код, который я пытался скомпилировать. Когда я попытался с std = c99, он не прошел с предупреждениями о "неявном объявлении типа struct addrinfo" и "неявной декларации функции getaddrinfo". Он работает с std = gnu99.
#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;
}
Команды, которые я использовал для компиляции:
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
Глядя на fail.i(preprocessed header), я вижу, что компилятор прав: эти типы не были объявлены в заголовках.
Итак, я пошел в заголовки и заметил, что getaddrinfo окружен охранником #ifdef __USE_POSIX, который, очевидно, не объявляется при компиляции с помощью c99.
Как сообщить gcc, что я хочу использовать c99 и POSIX? Я действительно не хочу использовать gnu99 в случае, если я решил позже переключать компиляторы (например, Clang или icc).
Просто потому, что getaddrinfo
(расширение POSIX.1g) не является частью стандартного c99:
http://www.schweikhardt.net/identifiers.html
Оставайтесь с -std=gnu99
или -D_POSIX_C_SOURCE=200112L