首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么gcc4发出警告以及如何避免

为什么gcc4发出警告以及如何避免
EN

Stack Overflow用户
提问于 2010-04-14 23:11:39
回答 2查看 263关注 0票数 2

我有一个函数声明为:

代码语言:javascript
复制
void    event_add_card (EventAddr addr, EventType type, unsigned char card);

和联合

代码语言:javascript
复制
typedef union EventData
{
    float           money;      /**< money info */
    unsigned char   card;       /**< new card */
}
EventData;

当我编译以下代码时:

代码语言:javascript
复制
EventData data = {};

event_add_card (0,0, data.card);

启用warning -Wconversion后,我收到以下警告:

代码语言:javascript
复制
player-stud.c|71| warning: passing argument 3 of 'event_add_card' with different width due to prototype

为什么gcc4不成功,如何修复?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-15 07:08:36

在4.3之前的版本中,根据原型是否在作用域中,当行为可能不同时,-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。)

票数 3
EN

Stack Overflow用户

发布于 2010-04-15 03:03:24

问题是您使用的是-Wconversion

您的代码没有任何问题,您也无法使-Wconversion不生成该警告。

示例:

代码语言:javascript
复制
void someFunction(unsigned char foo);
...
unsigned char bar = 'f';
someFunction(bar);

如果编译并使用-Wconversion,则会产生相同的错误

-Wconversion的目的是在K&R和ISO之间转换时识别问题,而您并没有这样做。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2638558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档