2

我有一个声明为的函数:

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

2 回答 2

3

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

这不是很有用,除非在将旧的 K&R 样式代码转换为使用原型的过程中。因此,如果您使用的是旧版本的 gcc,则启用它通常不是一个有用的选项。

从 gcc 4.3 开始,行为发生了变化:它现在警告任何可能更改值的隐式转换(例如,在有符号和无符号整数之间,或整数和浮点数之间)。这相当有用。(但之前的功能并没有消失:它仍然可用,但重命名为-Wtraditional-conversion。)

(更多细节在http://gcc.gnu.org/wiki/NewWconversion。)

于 2010-04-14T23:08:36.283 回答
1

问题是您正在使用 -Wconversion

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

例子:

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

如果您编译和使用 -Wconversion 这将产生相同的错误

-Wconversion 旨在识别在 K&R 和 ISO C 之间转换时出现的问题,而您没有这样做。

于 2010-04-14T19:03:23.510 回答