C言語再履修シリーズ。
・・・なのだが、書いた記事の復習もする。
[c/c++][CERT]ernor_tという型があるのか
https://hiro99ma.blogspot.com/2018/12/cccerterrort.html
DCL09-C. errno を返す関数は返り値を errno_t 型として定義する
https://www.jpcert.or.jp/sc-rules/c-dcl09-c.html
記事を書いたときは読んだだけだったのだが、errnoを使う機会が出てきたので使ってみた。
みたら、コンパイルエラー!!
打ち間違えなのかと見直したが、そうではない。
どういうことだ、いったい??
errno_t ‐ 通信用語の基礎知識
https://www.wdic.org/w/TECH/errno_t
errno_tは、Microsoftが提案し、Visual C++に追加された変数型である
えー??
いや、でもUbuntu18.04でtypedefされているのも確認したのだ。
オライリー「Cクイックリファレンス」でも、errno_t型はあるように書かれている。
ただ「セキュア関数の戻り値」について言及している箇所なので、条件があるのか?
しかし、#defineを変えても、/usr/include/errno.hを直接includeしても、全然うまくいかない。
std=c11もstd=gnu11もダメだし、__STDC_LIB_EXT1__や__STDC_WANT_LIB_EXT1__もだめだ。
なぜなんだ・・・。
原文のCERTは、わかりやすい。
というよりも、2018年に更新されているようだから、その影響か。
#ifndef __STDC_LIB_EXT1__
typedef int errno_t;
#endif
と書いてあるので、__STDC_LIB_EXT1__が定義されていればerrno_tが使えそうなものなのだが、うまくいかんかった(gcc v7.3.0)。
そこまでやるくらいなら、intでいいんじゃないの、と私は思った。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。