Вопрос по gcc, c, posix – Почему нельзя найти getaddrinfo при компиляции с gcc и std = c99

16

У меня есть следующий код, который я пытался скомпилировать. Когда я попытался с 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 (предварительно обработанный заголовок), я вижу, что компилятор прав: эти типы не были объявлены в извлеченных заголовках.

Поэтому я пошел к заголовкам и заметил, что getaddrinfo окружен защитой #ifdef __USE_POSIX, которая явно не объявляется при компиляции с c99.

Как мне сказать gcc, что я хочу использовать c99 и POSIX? Я действительно не хочу использовать gnu99 на случай, если позже решу переключить компиляторы (например, Clang или icc).

ах, лабиринт ifdef лабиринт пробивает снова tbert
Ты пыталсяgcc -c -ofail.o -Wall -Werror -std=c99 -D__POSIX -save-temps fail.c? Это или указать на#define __POSIX на вершинеfail.c. oldrinb
Я только что проверил еще раз, и это ___USE_POSIX dave
Макросы с двойным подчеркиванием предназначены только для внутреннего использования. Вы должны определить_POSIX_C_SOURCE, _XOPEN_SOURCE, или же_POSIX_SOURCE как сказано в верхней части справочной страницы getaddrinfo в разделе «Требования к макросам тестирования возможностей». И, пожалуйста, прочитайте соответствующую функцию feature_test_macros (7). Alan Curry
Кстати, вы уверены, что это__POSIX и не_POSIX_C_SOURCE? oldrinb

Ваш Ответ

1   ответ
17

Просто потому чтоgetaddrinfo (Расширение POSIX.1g) не является частью стандартного c99:

http://www.schweikhardt.net/identifiers.html

оставаться с-std=gnu99 или же-D_POSIX_C_SOURCE=200112L

Похожие вопросы