将宏参数强制为某种类型

时间:2017-10-18 14:39:56

标签: c macros pc-lint

我在我的代码上运行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;
}

1 个答案:

答案 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会很满意,但据我所知,它可能仍会抱怨。警告的根本原因仍然存在:将枚举类型的值用于其整数值而不是用于其身份是值得怀疑的。如果你想要命名整数常量,那么声明变量或为它们定义宏。