2008-10-3[金] C++よくある罠

少し前にやってしまったバグ。
WTL でCStringを使ってると、ポインタ取り出すのに LPCTSTR(strBuf) のような キャスト表現を使うようになってしまったのですが、

 CComBSTR  bar;
   :
   :
 CString foo(LPCTSTR(bar));
 foo.MakeUpper();

なんてしたら、foo.MakeUpper()の行でfooがstruct,unionじゃない、って 怒られてしまったのでした。

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

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

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