• ベストアンサー

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を使わない以外に、解決方法ないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

-std=c99を指定すると、GNU拡張が抑止されてしまいます。これはC99の問題ではなく、-std=c89とした場合でも同じはずです。 この問題を解消するには、-std=c99ではなく、-std=gnu99とします。

Pholiota
質問者

お礼

ありがとうございます! なるほど、gnu99とするとうまくいきました。 が、manを読んでもよくわからないのですが・・・ この場合、getaddrinfoがGNU拡張だったため、ということでしょうか?

その他の回答 (2)

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.3

-std=c99 を付けると、基本的には C99 にある関数しか使えなくなります。getaddrinfo のような UNIX 固有の関数を使うには機能検査マクロが必要です。 とりあえずソースの最初 (#include よりも前) に #define _POSIX_C_SOURCE 200112L の一行を入れてみてください。 これを書くことで、UNIX の共通規格である POSIX.1-2001 で定められた機能が (本来の C99 にないものも含めて) 使えるようになります。

Pholiota
質問者

お礼

なるほど、 オプションをgnu99にする以外にも、 こんな方法もあるのですね。 ありがとうございました!

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

> この場合、getaddrinfoがGNU拡張だったため、ということでしょうか? C規格の標準関数ではないという意味では、(例えPOSIX準拠であったとしても)GNU拡張であることには変わりありませんが、標準ヘッダではないので直接ダメということではないと思います。 今手元に同じ環境がないのではっきりしたことは言えません。 インクルードしているヘッダを見れば、多分原因が分かると思います。 -std=c89や-std=c99を指定した場合、__STRICT_ANSI__マクロが定義されますので、それをキーワードに検索すればよいと思います。

関連するQ&A