【问题标题】:Why gcc4 warn and how to avoid it为什么 gcc4 会发出警告以及如何避免它
【发布时间】:2010-04-14 15:11:39
【问题描述】:

我有一个函数声明为:

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 不成功以及如何修复它???

【问题讨论】:

  • 因为联合。您确定不打算将其定义为结构吗?

标签: c gcc gcc-warning gcc4


【解决方案1】:

在 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。)

【讨论】:

    【解决方案2】:

    问题在于您使用的是 -Wconversion

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

    例子:

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

    如果你编译和使用 -Wconversion 也会产生同样的错误

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

    【讨论】:

      猜你喜欢
      • 2015-09-28
      • 2011-06-24
      • 2019-06-13
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多