c - 为什么用gcc和std=c99编译时找不到getaddrinfo

标签 c gcc posix

我尝试编译以下代码。当我尝试使用 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(预处理后的 header ),我发现编译器是正确的:这些类型尚未在引入的 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

关于c - 为什么用gcc和std=c99编译时找不到getaddrinfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12024703/

相关文章:

sockets - 同步 I/O 会使线程忙碌吗?

c++ - 将单例实例限制为线程

c - linux 中的闹钟和 sleep

c - 在运行时加载动态库会产生不一致和意外的结果、缺少符号和空 PLT 条目。为什么?

c - 如何通过终止符跳出循环?

c - setjmp longjmp 与堆栈

c++ - 禁用不兼容选项的 gcc 警告

c++ - sstream : No such file or directory

c++ - 如何在 centos 6 上恢复系统 gcc 编译器

c - 如何从服务器端发送消息队列以显示在客户端上?