2008-10-3[金] C++よくある罠
少し前にやってしまったバグ。 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>()を基準に(キャスト)を 警告にするモードとか... そういったもの) を、 もっとサポートしてくれたら、と思ってしまうのでした。 |