我有一个函数声明为:
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);启用warning -Wconversion后,我收到以下警告:
player-stud.c|71| warning: passing argument 3 of 'event_add_card' with different width due to prototype为什么gcc4不成功,如何修复?
发布于 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。)
发布于 2010-04-15 03:03:24
问题是您使用的是-Wconversion
您的代码没有任何问题,您也无法使-Wconversion不生成该警告。
示例:
void someFunction(unsigned char foo);
...
unsigned char bar = 'f';
someFunction(bar);如果编译并使用-Wconversion,则会产生相同的错误
-Wconversion的目的是在K&R和ISO之间转换时识别问题,而您并没有这样做。
https://stackoverflow.com/questions/2638558
复制相似问题