コンパイルしようとしていた次のコードがあります。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 を使用したくありません。