2010-04-14 76 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这将产生同样的错误不要这样做。

相关问题