前の記事で、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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。