18

コンパイルしようとしていた次のコードがあります。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 でコンパイルするときに明らかに宣言されていません。

c99 と POSIX を使用したいことを gcc に伝えるにはどうすればよいですか? 後でコンパイラ (Clang や icc など) を切り替える場合に備えて、gnu99 を使用したくありません。

4

1 に答える 1

21

getaddrinfo(POSIX.1g 拡張機能) が標準の c99 の一部ではないという理由だけで:

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

とどまる-std=gnu99-D_POSIX_C_SOURCE=200112L

于 2012-08-19T07:20:44.493 に答える