【问题标题】:Resolving a warning in macro解决宏中的警告
【发布时间】:2014-11-12 15:02:11
【问题描述】:

我正在处理一些产生警告的宏。其中之一是ConvToSector(x)

#define STARTSECTOR 0x0002000u
#define STARTLSB    6u
#define STARTNUM    7u
#define TRICKYLSB   3u
#define ConvToSector(x) (((x)>=STARTSECTOR) ? ((((x)-STARTSECTOR) >> STARTLSB) + STARTNUM) : ((x) >> TRICKYLSB))

生产

conversion to 'uint8_t' from 'long unsigned int' may alter its value [-Wconversion]

我知道所有常量都是无符号的,ConvToSector(x) 的输入是无符号整数 (uint32_t)。那么long unsigned int 是从哪里来的呢?

【问题讨论】:

  • 您是否将返回值分配给uint8_t?您系统上的sizeof(unsigned long)sizeof(unsigned) 是什么?
  • 你将结果存储到什么地方?
  • 请给出一个完整自包含的例子。这包括对 ConvToSector 的调用以及存储结果的参数和变量的类型。
  • @Kevin,这正是问题所在,即存储结果的变量是uint8_t 类型。这对于经验丰富的工程师来说应该是显而易见的,但对于初级 gcc 来说,这会变得更加困难,因为它将宏作为警告的来源,而不是代码中出现的宏本身。

标签: c macros gcc-warning


【解决方案1】:

警告是正确的;将 long unsigned int 值转换为 uint8_t 可以更改其值。

您可以通过不指定 -Wconversion 选项(默认情况下未启用,因此必须设置它)或使用强制转换而不是隐式转换来禁止警告。如果没有更多信息,我无法确切知道应该在哪里添加演员表。

至于消息中提到的long unsigned int 类型,再一次,如果不看更多代码很难说清楚。 uint32_t 很可能是 unsigned long int 的 typedef —— 但一个快速实验表明 gcc 的错误消息指的是声明的类型,即使它是 typedef。

【讨论】:

    猜你喜欢
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2022-08-09
    • 2020-08-05
    • 1970-01-01
    • 2012-06-14
    相关资源
    最近更新 更多