【问题标题】:Why can't getaddrinfo be found when compiling with gcc and std=c99为什么用gcc和std=c99编译时找不到getaddrinfo
【发布时间】:2012-08-15 00:26:33
【问题描述】:

我尝试编译以下代码。当我尝试使用 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)。

【问题讨论】:

  • 你试过gcc -c -ofail.o -Wall -Werror -std=c99 -D__POSIX -save-temps fail.c吗?或者指出fail.c顶部的#define __POSIX
  • 对了,你确定是__POSIX而不是_POSIX_C_SOURCE
  • 我刚刚又查了一下,它是___USE_POSIX
  • 双下划线宏仅供 glibc 内部使用。您应该定义 _POSIX_C_SOURCE_XOPEN_SOURCE_POSIX_SOURCE,就像它在“功能测试宏要求”下的 getaddrinfo 手册页顶部所说的那样。请务必阅读相关的 feature_test_macros(7)。
  • 啊,glibc ifdef 迷宫又来了

标签: c gcc posix


【解决方案1】:

仅仅是因为getaddrinfo(POSIX.1g 扩展)不是标准 c99 的一部分:

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

留在-std=gnu99-D_POSIX_C_SOURCE=200112L

【讨论】:

    猜你喜欢
    • 2017-01-17
    • 2010-10-09
    • 2011-01-08
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    相关资源
    最近更新 更多