繁体   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