为什么gcc4警告以及如何避免它

时间:2010-04-14 15:11:39

标签: c gcc gcc-warning 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);

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

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

为什么gcc4不成功以及如何修复它???

2 个答案:

答案 0 :(得分:3)

在4.3之前的gcc版本中,-Wconversion会在行为可能不同时发出警告,具体取决于原型是否在范围内。在您给出的示例中,参数3(data.card)属于unsigned char;如果event_add_card()的原型在范围内,它将作为unsigned char传递,但如果原型不在范围内,由于C的整数提升规则,它将作为int传递 - 因此警告。

除了在转换旧的K&amp; R风格代码以使用原型的过程中,这不是很有用。因此,如果您使用的是旧版本的gcc,则启用它通常不是一个有用的选项。

从gcc 4.3开始,行为已经改变:它现在警告任何可能改变值的隐式转换(例如,有符号和无符号整数之间,或者整数和浮点数)。这非常有用。 (之前的功能尚未消失:它仍然可用,但重命名为-Wtraditional-conversion。)

(更多详情请见http://gcc.gnu.org/wiki/NewWconversion。)

答案 1 :(得分:1)

问题是你正在使用-Wconversion

您的代码没有任何问题,您无法做任何事情--Wconversion不会产生该警告。

示例:

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

如果编译并使用-Wconversion

,这将产生相同的错误

-Wconversion用于识别您在K&amp; R和ISO C之间进行转换时遇到的问题。