2017/02/21

[c/c++]getaddrinfo()はISO CではなくPOSIX2001か

前の記事で、gethostbyname()ではなく、getaddrinfo()を使った方が良いそうなので、使ってみた。
しかし、gccで-std=c99にするとコンパイルエラーになるのが気になる。

 

c - Why can't getaddrinfo be found when compiling with gcc and std=c99 - Stack Overflow

それはね、getaddrinfoはc99に属さないからだよ、とのこと。
リンク先の資料では、こうなっていた。

[Name]                   [Header]             [Standard]
getaddrinfo netdb.h P2001

リンク先には表が2つあり、[Standard]は、上側がC99など、下側がP90などになっていた。

どうも、C99みたいにPOSIXにも名前があるようで、P09やP2001がそれに当たるようだ。
C99みたいな方は、ISO Cと呼ぶらしい。
だから、上の表はISO C、下の表はPOSIXのようだ。

Man page of GETADDRINFO
こちらには「POSIX.1-2001. getaddrinfo() 関数は RFC 2553 に記載されている。 」と書いてあった。

 

gccはCコンパイラで、-stdはc89とかc99とかの指定をするだけ、POSIXはコンパイルしているLinuxの環境に依存している、と思っていたのだが、そうではないということか。
includeしてリンクするだけだから、関係ないと思っていたのだよ。
回答にあるように、「-std=c99」ではなく「-std=gnu99」にするとコンパイルできた。

 

Standards - Using the GNU Compiler Collection (GCC)

-std=c99は単にC99で、-std=gnu99は「C99 with GNU extensions」とのことだ。
GNU拡張というと、GNUの独自言語仕様ばかりに目が行ってしまうが、こういうところもGNU拡張なんだな。

 

まあ、ESP8266みたいなフリースタンディング環境だと、こういうのもどっからかライブラリを持ってくるので、あまり関係ない。
RTOS SDKだとlwip_getaddrinfo()が使えるし、マクロでgetaddrinfo()でも使えるようだ。
そんなことをいえば、別にgethostbyname()を使ってもよいのだけどね。。。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。