[英]Why gcc4 warn and how to avoid it
我有一個函數聲明為:
void event_add_card (EventAddr addr, EventType type, unsigned char card);
和聯合
typedef union EventData
{
float money; /**< money info */
unsigned char card; /**< new card */
}
EventData;
當我編譯以下代碼時:
EventData data = {};
event_add_card (0,0, data.card);
啟用警告-Wconversion
我收到以下警告:
player-stud.c|71| warning: passing argument 3 of 'event_add_card' with different width due to prototype
為什么gcc4不成功以及如何解決???
在4.3之前的gcc版本中,如果行為可能取決於原型是否在范圍內,則-Wconversion
會產生警告。 在您給出的示例中,參數3( data.card
)是unsigned char
; 如果event_add_card()
的原型在范圍內,則將以unsigned char
形式傳遞;但是,如果原型不在范圍內,則由於C的整數提升規則而將以int
形式傳遞-因此發出警告。
除了將舊的K&R風格的代碼轉換為使用原型的過程之外,這不是很有用。 因此,如果您使用的是舊版的gcc,啟用它通常不是有用的選項。
從gcc 4.3開始,行為已更改:現在警告任何可能更改值的隱式轉換(例如,在有符號和無符號整數之間,或整數和浮點數之間)。 這是非常有用的。 (不過,以前的功能還沒有消失:它仍然可用,但已重命名為-Wtraditional-conversion
。)
(有關更多詳細信息,請參見http://gcc.gnu.org/wiki/NewWconversion 。)
問題是您正在使用-Wconversion
您的代碼沒有錯,也沒有任何辦法使-Wconversion不產生該警告。
例:
void someFunction(unsigned char foo);
...
unsigned char bar = 'f';
someFunction(bar);
如果您編譯並使用-Wconversion,將產生相同的錯誤
-Wconversion旨在確定在K&R和ISO C之間進行轉換時沒有做的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.