差分表示


*&date(Y-n-j[lL],2008/10/3); C++よくある罠

少し前にやってしまったバグ。~
WTL でCStringを使ってると、ポインタ取り出すのに LPCTSTR(strBuf) のような
キャスト表現を使うようになってしまったのですが、
  CComBSTR  bar;
    :
    :
  CString foo(LPCTSTR(bar));
  foo.MakeUpper();
[CR]
なんてしたら、foo.MakeUpper()の行でfooがstruct,unionじゃない、って
怒られてしまったのでした。

CString foo(LPCTSTR bar); と解釈されるので関数内でのプロトタイプ宣言に
化けてただけなんですが、すっかり関数内プロトタイプ宣言なんて
禁じ手的にしてたせいかすぐには思い至れなかったのでした。
( CString foo(); とかだと
デフォルトコンストラクタの使用上の注意として意識してるけど)

C/C++でよくある(?)コーディングスタイルだと
グローバル関数変数のプロトタイプ宣言はヘッダ1箇所のみにする、
ってのが普通だろうから、いっそ関数内プロトタイプ宣言は警告に
するコンパイラ・オプションがほしいなあ、と思ったり...

これに限らず、C/C++コンパイラは、歴史的に文法をかえるわけにいかないけれど
現行の開発手法(コーディングスタイル)ではグレーになってしまう用法とかを
検出/支援するようなコンパイルオプション
(gccでの 多重 extern 宣言の検出や、dmcでの???_cast<T>()を基準に(キャスト)を
警告にするモードとか... そういったもの)
を、
もっとサポートしてくれたら、と思ってしまうのでした。


----
#comment