- ベストアンサー
linux系OSでC99
FreeBSD上で作った自作のプログラムを、 他のOSでもコンパイルできるように移植しているのですが・・・ Linux系OS(turboLinuxや、CentOS等)のgccで、 -std=c99 をつけるとエラーがたくさんでて困っています。 たとえば・・・ #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> int main( int argc, char **argv ) { struct addrinfo addrinfo_hint, *addrinfo ; memset( &addrinfo_hint, 0, sizeof( addrinfo_hint ) ) ; addrinfo_hint.ai_flags = AI_PASSIVE ; addrinfo_hint.ai_family = AF_INET ; addrinfo_hint.ai_socktype = SOCK_STREAM ; getaddrinfo( NULL, "echo", &addrinfo_hint, &addrinfo ) ; } これをコンパイルしようとすると・・・ gcc -std=c99 -o sample sample.c -std=c99をつけなければコンパイルできるのですが、 -std=c99をつけると、getaddrinfo関数や、関連する構造体やマクロが まったく定義されなくなってしまうようで、 未定義関係のエラーが大量にでてしまいます。 getaddrinfoのmanを見ても、特に問題になりそうなことは書いていないのですが・・・ なぜなのでしょうか? c99を使わない以外に、解決方法ないでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
-std=c99を指定すると、GNU拡張が抑止されてしまいます。これはC99の問題ではなく、-std=c89とした場合でも同じはずです。 この問題を解消するには、-std=c99ではなく、-std=gnu99とします。
その他の回答 (2)
- UKY
- ベストアンサー率50% (604/1207)
-std=c99 を付けると、基本的には C99 にある関数しか使えなくなります。getaddrinfo のような UNIX 固有の関数を使うには機能検査マクロが必要です。 とりあえずソースの最初 (#include よりも前) に #define _POSIX_C_SOURCE 200112L の一行を入れてみてください。 これを書くことで、UNIX の共通規格である POSIX.1-2001 で定められた機能が (本来の C99 にないものも含めて) 使えるようになります。
お礼
なるほど、 オプションをgnu99にする以外にも、 こんな方法もあるのですね。 ありがとうございました!
- jacta
- ベストアンサー率26% (845/3158)
> この場合、getaddrinfoがGNU拡張だったため、ということでしょうか? C規格の標準関数ではないという意味では、(例えPOSIX準拠であったとしても)GNU拡張であることには変わりありませんが、標準ヘッダではないので直接ダメということではないと思います。 今手元に同じ環境がないのではっきりしたことは言えません。 インクルードしているヘッダを見れば、多分原因が分かると思います。 -std=c89や-std=c99を指定した場合、__STRICT_ANSI__マクロが定義されますので、それをキーワードに検索すればよいと思います。
お礼
ありがとうございます! なるほど、gnu99とするとうまくいきました。 が、manを読んでもよくわからないのですが・・・ この場合、getaddrinfoがGNU拡張だったため、ということでしょうか?