BK通信 ―Bad Knowhow Tsushin―
#03 C++のバッドノウハウ
ソフトウェアなどを使いこなすために,
C++再考
いまどきのWebアプリケーションはPerlやRubyなどのLightweight Languageで作られているものが多く,
C言語ではなくC++を使うのは,
それでは,
C++のboolと未初期化変数
C++にはboolという型があり,
リスト1 初期化を忘れたら
bool b; // 初期化を忘れている
if (b == true) {
printf("trueです\n");
} else if (b == false) {
printf("falseです\n");
} else {
printf("どっちでもないよ\n");
}
このくらいの簡単な例ならコンパイラの警告で簡単に検出されますが,
C++のアクセス制御
C++はクラスのメンバに対して,
リスト2 アクセス制御を骨抜きにするマクロ
#define private public
リスト2のマクロは,
ただし,
リスト3 こんなコードの場合には?
class Foo {
int func();
...
リスト4 classを強制的に
#define class struct
このようなテクニックが必要な場面はほとんどないと思いますが,
...という話を知人にしたところ,
C++とgoto
プログラミング言語におけるgoto文は歴史的に,
リスト5 多重ループから外に出たい
while (...) {
while (...) {
if (...) {
goto done;
}
}
}
done:
printf("おわったよ")
ではリスト6のように,
リスト6 ループに飛び込みたい
while (...) {
while (...) {
// A
...
deep_inside:
...
}
}
goto deep_inside;
普通はこんなことはやらないと思いますが,
まとめ
今回はC++のバッドノウハウを3つ紹介しました。最初のboolの話は実際にはまった問題ですが,
ところで,
- 注1)
- オブジェクトをバイト列表現などに変換すること。
- 注2)
- 厳密にはnon-POD
(Plain Old Data) 型のオブジェクト。 - 注3)
- 『Effective C++ 原著第3版』
(Scott Meyers著, 小林 健一郎訳, ピアソン・ エデュケーション, 2006) - 注4)
- 『C++ Coding Standards』
( Herb Sutter/ Andrei Alexandrescu著, 浜田 光之監修, 浜田 真理訳, ピアソン・ エデュケーション, 2005)