0

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

1 回答 1

3

像函数这样的宏是否可以强制参数为某种类型,或者它总是只是一个 int。

您似乎误解了问题的性质。pc lint 抱怨的不是宏调用本身。不进行任何转换。相反,问题在于宏扩展的代码。得到的完整声明是

    uint32_t temp = (((values) & 0x7) << 11);

,其中values是类型TEST_VALUE,一个枚举。评估该表达式涉及转换values为 type int, pc lint 认为这有问题,足以引起警告。如果您直接使用上述行,而不是通过宏生成它,它将发出相同的警告。

现在,您可以在宏中进行显式转换;这样的事情可能是合适的:

#define RESULT(x)            (((uint32_t)(x) & 0x7) << 11)

但是,这仍然涉及枚举到整数的转换。如果您像这样明确地表达转换,也许 pc lint 会感到满意,但据我所知,它可能仍然会抱怨。警告的根本原因仍然存在:将枚举类型的值用作其整数值而不是其标识是有问题的。如果您想要命名的整数常量,请为它们声明变量或定义宏。

于 2017-10-18T15:03:10.847 回答