C++相談室 part58
レス数が900を超えています。1000を超えると表示できなくなるよ。
0949デフォルトの名無しさん
2007/11/11(日) 23:50:02こんなCの関数があって、これは俺が作ったものではないので変更できません。
typedef struct foo{
int a;
}foo;
こんな構造体があって、Cなら
foo *f;
data_get(&f);
こんな風に使います。
C++で今までVisual C++ 2005 で開発してこの関数を使うとき
foo* f;
data_get(reinterpret_cast<void**>(&f));
とやっていて、動作も特に問題が無かったのですが、g++4.1でコンパイルしたところ
warning: dereferencing type-punned pointer will break strict-aliasing rules
と怒られました。
一応この警告の意味とコードが標準に準拠してないことは理解したつもりですが
それでは、data_get関数をC++から安全に使うにはどのようにしたらいいでしょうか?
foo* f;
void** tmp = reinterpret_cast<void**>(&f);
data_get(tmp);
としてもも警告が出てしまいます。
void* tmp;
data_get(&tmp);
foo* f = reinterpret_cast<foo*>(tmp);
これだと警告が出ないのですが、大丈夫でしょうか。
レス数が900を超えています。1000を超えると表示できなくなるよ。