【iOS版アプリ】不具合のお知らせ

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

gooドクター

A 回答 (3件)

-std=c99を指定すると、GNU拡張が抑止されてしまいます。

これはC99の問題ではなく、-std=c89とした場合でも同じはずです。
この問題を解消するには、-std=c99ではなく、-std=gnu99とします。
    • good
    • 0
この回答へのお礼

ありがとうございます!
なるほど、gnu99とするとうまくいきました。

が、manを読んでもよくわからないのですが・・・
この場合、getaddrinfoがGNU拡張だったため、ということでしょうか?

お礼日時:2007/12/26 16:47

-std=c99 を付けると、基本的には C99 にある関数しか使えなくなります。

getaddrinfo のような UNIX 固有の関数を使うには機能検査マクロが必要です。

とりあえずソースの最初 (#include よりも前) に
#define _POSIX_C_SOURCE 200112L
の一行を入れてみてください。
これを書くことで、UNIX の共通規格である POSIX.1-2001 で定められた機能が (本来の C99 にないものも含めて) 使えるようになります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/01/13 16:34

> この場合、getaddrinfoがGNU拡張だったため、ということでしょうか?



C規格の標準関数ではないという意味では、(例えPOSIX準拠であったとしても)GNU拡張であることには変わりありませんが、標準ヘッダではないので直接ダメということではないと思います。

今手元に同じ環境がないのではっきりしたことは言えません。
インクルードしているヘッダを見れば、多分原因が分かると思います。
-std=c89や-std=c99を指定した場合、__STRICT_ANSI__マクロが定義されますので、それをキーワードに検索すればよいと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

gooドクター

人気Q&Aランキング