2012-08-19 12 views
15

コンパイルしようとしていた以下のコードがあります。 std = c99を試してみたところ、 "struct addrinfo型の暗黙の宣言"と "関数のgetaddrinfoの暗黙の宣言"に関する警告で失敗しました。これはstd = gnu99で動作します。gccとstd = c99でコンパイルするときにgetaddrinfoを見つけることができない理由

#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; 
} 

私がコンパイルに使用するコマンドは次のとおりです。

私はコンパイラが正しいと見fail.i(前処理ヘッダ)を見てみると
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 

:これらのタイプは引っ張らヘッダで宣言されていません

私はヘッダーに行き、getaddrinfoが#ifdef __USE_POSIXガードに囲まれていることに気付きました。これは明らかにc99でコンパイルするときには宣言されていません。

gccにc99とPOSIXを使用するように指示する方法を教えてください。私は実際にコンパイラを後で切り替えることにした場合にgnu99を使いたいとは思っていません(例えばClangやiccなど)。

+0

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

滞在あなたは 'gccの-c -ofail.oを試してみました - Wall -Werror -std = c99 -D__POSIX -save-temps fail.c'?それは、 'fail.c'の先頭にある' #define __POSIX'をポイントしてください。 – oldrinb

+0

ところで、あなたはそれが '_POSIX_C_SOURCE'ではなく' __POSIX'だと確信していますか? – oldrinb

+0

私はもう一度チェックしました。それは___USE_POSIXです。 – dave

答えて

16

getaddrinfo(POSIX.1g拡張子)は、標準的なC99の一部ではないという理由だけで:-std=gnu99または-D_POSIX_C_SOURCE=200112L

関連する問題