GCC 4 編譯警告:warning: dereferencing type-punned pointer will break strict-aliasing rules 有什麼比較好的解決辦法?


改代碼 / -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&(tmp_ptr);

希望對你有幫助


推薦閱讀:

微軟究竟遇到了什麼問題使得他們到現在都無法在 C1 中實現兩步名稱查找?
微軟會把 clang 擴展到可以徹底替換 C1,並真的換掉 C1 嗎?
這個程序哪裡錯了,還是G++出了問題?
為什麼儘管 C++ 早就有了很多現代功能,但是卻長期給人原始的印象呢?

TAG:程序員 | C | GCC | 編譯器 |