2019/01/20

[c/c++][CERT]ポインタの比較

C言語の再履修シリーズ。。。なのに、間が空きすぎてしまった。
こういうの、気力がいるから、仕事から帰ってからだとなかなか手に付かないのよねぇ。


EXP16-C. 関数ポインタを定数値と比較しない

関数ポインタというと、こういう形の話だろうと思って読んでいた。

typedef void (*func_t)(void);

ここでは、単に関数名だけを比較してるからダメだよ、という話だった。

if (printf != NULL) {
  ...
}

まあ、誤記以外にはやらなさそうな気がする。

ただ、自分で宣言した関数で、別のところで同じ名前のグローバル変数があって、グローバル変数のexternを忘れてて関数の方を・・・
いや、そういうシーンはあり得んな。リンクエラーだ。


ちょっと違うけど、似たような目にあった。
PythonでQRコードを作ろうとして、自分のファイル名をqrcode.pyなんて名前にしたけど、使ったライブラリもqrcodeで、importすると自分をimportしてしまって、qrcodeのメソッドを呼ぼうとしたら「そんなのない!」って言われて悩んだのだった。



EXP34-C. null ポインタを参照しない

もう1つ、似たようなポインタの話を。

まあ、NULLポインタは使ったらいかんだろう、というのはC言語の共通認識としてだいたい広まっているだろう。
ここで困るのは、C言語でスタックを使った変数の場合は値が不定になるということだ。
グローバル変数は、スタンダードなC言語であればmain()前にゼロクリアすることになっているから、まあよかろう(非力なシステムでは、そこも省略するかもしれんが)。


C++では"NULL"というものは定義されていなかったと思う。
やるなら、

const int NULL = 0;

みたいなものを自分で定義するようになっていた気がする。C++第3版くらいの知識なので、古いと思うが。
C++では、0はすべての型の0として使えるようになっているそうだ。
型チェックが厳しいから、変に(void *)などとキャストするとまずいのだ。

まあ、nullptrってのもC++11にはあるそうだし、言語でチェックできるならいいですな。

0 件のコメント:

コメントを投稿

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