我在我的代码上运行pc lint,我收到以下警告Converting enum 'TEST_VALUE' to 'int
。
像函数这样的宏是否可以强制参数为某种类型,或者它总是只是一个int。我知道我可以让函数configure
传递一个int,但然后pc-lint也会抱怨。
#define RESULT(x) (((x) & 0x7) << 11)
typedef enum {
RES = 0x00,
RES_TWO,
RES_THREE,
RES_FOUR
} TEST_VALUE;
int configure(TEST_VALUE values)
{
uint32_t temp = RESULT(values);
return temp;
}
答案 0 :(得分:3)
像函数一样的宏是否可以强制参数为某种类型,或者它总是只是一个int。
您似乎误解了问题的本质。 pc lint抱怨的不是宏调用本身。没有任何转换由此执行。相反,问题在于宏扩展的代码。得到的完整陈述是
uint32_t temp = (((values) & 0x7) << 11);
,values
类型为TEST_VALUE
,枚举。评估该表达式涉及将values
转换为类型int
,哪个pc lint认为可疑到足以保证警告。如果您直接使用上面的行,它会发出相同的警告,而不是通过宏生成它。
现在,你可以在宏中添加一个显式的强制转换;这样的事情可能是合适的:
#define RESULT(x) (((uint32_t)(x) & 0x7) << 11)
然而,仍然涉及枚举到整数的转换。如果你明确地表达转换,那么pc lint会很满意,但据我所知,它可能仍会抱怨。警告的根本原因仍然存在:将枚举类型的值用于其整数值而不是用于其身份是值得怀疑的。如果你想要命名整数常量,那么声明变量或为它们定义宏。