無名namespaceは忘れずに

C++でファイル内だけで使い捨てるクラスは忘れずに無名namespaceをつけましょう、という初心者的な話。 Cのころの癖でよく付け忘れるので備忘録がわりに。 (もちろん、C++でもPODならつけてなくても大丈夫っぽい) ある日突然メモリ破壊系のバグが出るハメになる。 続きを読む
2
響谷ゆろ@東方の迷宮PS4&switch 7/16発売 @yuropu

ところでさ?C++でファイルスコープでしか使わない構造体Aって名前をb.cppとc.cppで定義すると、違う中身の定義でもc.cppがb.cppの構造体定義でメモリ確保したりするんだけど、これってVC++のバグ?それともC++だと当たり前なの?無名namespaceなしで。

2012-03-12 12:28:24
へっぽこ @heppoko

@yuropu VC でも gcc 4.5 でも再現しないなー。つまり、何かがおかしい。

2012-03-12 12:56:03
響谷ゆろ@東方の迷宮PS4&switch 7/16発売 @yuropu

@heppoko なんか確保される構造体と実行されるコンストラクタがシッチャカメッチャカになるんだけどへっぽこさんとこではどうでしょ?

2012-03-12 13:02:30
へっぽこ @heppoko

@yuropu うむ、VS2010 でも gcc4.5 でも変だね

2012-03-12 13:13:22
響谷ゆろ@東方の迷宮PS4&switch 7/16発売 @yuropu

@heppoko なんと。2008のバグじゃなくて仕様なのかな。構造体定義は実態持たないからその場のものを、メンバ関数はリンケージに従う。で、クラスはヘッダに書かれるから二回目以降の定義も警告せずにスルー、みたいな?やだなー。

2012-03-12 13:24:23
pepshiso @pepshiso

@yuropu C++ の仕様によると、同じ名前で中身が異なるクラスを定義すると undefined bahavior です

2012-03-12 13:28:15