よくやってしまうのだが、malloc()やmemcpy()を使ったのに、ヘッダファイルを追加し忘れていることがある。
まあ、コンパイル時にエラーが出るので分かるのだが、問題はその次だ。
どれをインクルードするとよいのだっけ?
ふっと思いつくのが、連続データに対する処理だからストリング命令、ということで<string.h>。
しかし、心の中で「もしかしたら<memory.h>だったかも・・・」と心配になる。
コンパイルすればわかるのだけど、なんか追加した標準ヘッダを間違えるって、なんか素人っぽいじゃないか。
できれば、修正後は一発で正解したいのだ。
そして、malloc()/free()は<stdlib.h>だということを思い知らされるのである。。。
どうでもいいけど、strcpy()なんかも<string.h>に入っていると、文字列用のヘッダだと勘違いしてしまうよね。
それはさておき。
<stdlib.h>と<string.h>をインクルードすれば何とかなるのはわかるが、では<memory.h>には何が入っているのだろう?
オライリーのCクイックリファレンスで調べてみたのだが・・・<memory.h>は標準ヘッダではなかった!
そうか、そうなんだ・・・。
/usr/include/memory.hを見ると、<features.h>と<string.h>をインクルードしているだけだった。
<features.h>なんて通常はインクルードさせたことが無かったのだが、GLIBCのバージョンなどいろいろ定義されている。
じゃあ、単に<string.h>をインクルードするより<memory.h>の方がいいのか?と思ったが、<string.h>も先頭で<features.h>をインクルードしていた。
というわけで、私の結論はこうだ。
- <string.h>でも<memory.h>でもいい
- <memory.h>は標準ヘッダではないので、すべてのコンパイラが持っているかは定かでは無い
- 標準ヘッダでないからといって、<memory.h>をインクルードしていても変ではない
標準じゃないからといって、使って問題があるわけではないのだ。
それに、個人的には「str***()」は<string.h>に、「mem***()」は<memory.h>に、となっていた方がわかりやすいと思う。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。