2010-04-14 75 views
2

我有一個函數聲明爲:爲什麼GCC4警告,以及如何避免它

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); 

啓用警告我收到以下警告:

player-stud.c|71| warning: passing argument 3 of 'event_add_card' with different width due to prototype 

爲什麼gcc4不成功以及如何解決?

+0

Bcause工會。你確定你沒有把它定義爲一個結構嗎? – eaanon01 2010-04-14 18:12:54

回答

3

在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

+0

*感謝*,這是個好消息 – 2010-04-15 10:05:04

1

的問題是,你使用-Wconversion

沒有什麼錯與您的代碼,並沒有什麼可以做,使-Wconversion不產生警告。

實施例:

void someFunction(unsigned char foo); 
... 
unsigned char bar = 'f'; 
someFunction(bar); 

如果編譯並使用-Wconversion

-Wconversion是指識別問題ķ& R和ISO C之間進行轉換時,你AREN這將產生同樣的錯誤不要這樣做。

相關問題