GCC 4 編譯警告:warning: dereferencing type-punned pointer will break strict-aliasing rules 有什麼比較好的解決辦法?
01-11
改代碼 / -fno-strict-aliasing / 不開優化 / -Wno-strict-aliasing (麻痹自己,眼不見心不煩,假裝沒問題),推薦順序,從左到右。
用個union。比如如果你的類型是int*和float*,那就
union Whatever
{
int* int_type;
float* float_type;
};
通過union而不是cast訪問,就行了。
其他人都給出了答案,需要補充的是,消除警告不一定是變得不安全了,也可能是明確更安全了,可能的代價就是失去了潛在的優化機會。除了通過調用參數消除這個警告之外,可以給相關類型加上__attribute__((__may_alias__))。
如果你能貼出你的code 會更好回答. 通過Parameter取消Warning是很危險的做法, Compiler跟你Warning的意義在於提醒你這些地方很有可能會出Bug, 如果你簡單的Dismiss這些Warning, 很可能往後會更難Debug... 而且大多數情況的warning意味的你的code有待改進. 最好的解決的辦法就是refactor你的code, 消除warning, 知道在-Wall也能完全compile為止.
我替你Google了一下,stackoverflow的解釋比較清楚:
http://stackoverflow.com/questions/4163126/c-dereferencing-type-punned-pointer-will-break-strict-aliasing-rules-warning
使用參數 -fstrict-aliasing 和 -Wstrict-aliasing 可以消除掉這個warning。有一個指針用作了不同的類型,編譯器告訴你如果堅持這樣做,它不能做編譯優化
這時候你就知道 動態語言有多麼好了吧.. ヾ(×× ) ?鴕鳥演算法,假裝看不到。。
用void* 作為中間變數轉換一下也是可以的
struct ParaType
{
int age;
bool gender;
...
};
關鍵代碼如下
char my_para[128];
void * tmp_ptr = my_para;
ParaType* my_para = reinterpret_cast&
希望對你有幫助
推薦閱讀:
※微軟究竟遇到了什麼問題使得他們到現在都無法在 C1 中實現兩步名稱查找?
※微軟會把 clang 擴展到可以徹底替換 C1,並真的換掉 C1 嗎?
※這個程序哪裡錯了,還是G++出了問題?
※為什麼儘管 C++ 早就有了很多現代功能,但是卻長期給人原始的印象呢?