2011-11-22 28 views
5
#define HTON_I32(x) htonl(x) 
inline float __HTON_F32(float x) 
{ 
    int i = HTON_I32(*((int *)(&x))); 
    return (*((float *)(&i))); 
} 

如何解決上面的代碼如何解決警告:提領類型-punned指針將打破嚴格走樣規則

+0

你可以用編譯-fno嚴格 - 啓用標誌。這將刪除有關嚴格別名問題的警告 –

+0

@TonyTheLion:它不能解決問題,它隱藏了它,並隱藏了代碼中的其他潛在問題。不是一個好主意。 – Mat

+0

@Mat,不,這會以優化成本解決問題。 –

回答

9

消除類型雙關警告dereferencing type-punned pointer will break strict-aliasing rules ,並與一些與工作不」更換T IN混疊面對脆弱:

#include <string.h> 

inline float __HTON_F32(float x) { 
    int i; 
    memcpy(&i, &x, sizeof x); 
    i = HTON_I32(i); 
    memcpy(&x, &i, sizeof x); 
    return x; 
} 

合理的優化編譯器會降低memcpy調用,生成當量(有時更好)代碼,您從類型雙關會得到什麼。

您將看到的另一個常見解決方案涉及工會。所有這些解決方案都假設爲sizeof(int) == sizeof(float)。你可能想要添加一個assert來達到這個效果。

1

您可以使用類型雙關,這需要照顧的可能對齊和走樣的問題工會(C99:TC3明確提到,這確實是合法的):

#include <stdint.h> 

inline float __HTON_F32(float x) { 
    union { float as_float; int32_t as_int; } value = { x }; 
    value.as_int = HTON_I32(value.as_int); 
    return value.as_float; 
} 
+1

對於任何想要TC3引用的用戶,請參閱第6.5.2.3節腳註82 –

+0

。 ...和C1x四月草案同一部分的腳註95;) – Christoph

+0

這究竟是做什麼的。 ? value.as_int = HTON_I32(value.as_int); – Sudhakar

相關問題