【发布时间】: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