簡體   English   中英

為什么GCC4警告以及如何避免

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM