1

我正在为我的嵌入式系统类编写一个设备处理程序,并且我正在尝试使用宏来检查第 i 位是否已设置。我的宏似乎无法正常工作,但内联函数可以。这是为什么?

#define TEST0 i&0x01
#define CLEAR0 i &= 0x01


inline short test0(short i) {
    return i&0x01;
}


int main() {
    short flag = 1;

    //this doesnt work
    if (TEST0(flag) == 0x01) {
        CLEAR0(flag);
    }

    //but this does
    if (test0(flag) == 0x01) {
        CLEAR0(flag);
    }

    return 0;
}
4

3 回答 3

3

语法错误。宏需要一个参数。

#define TEST0(i) ((i) & 0x01)

此外,使用空格来提高可读性,使用括号来提高安全性。

于 2013-01-26T20:00:17.360 回答
1

这是由于运算符优先级问题。此外,您需要宏的参数。

它被解析如下:

if (i & (0x01 == 0x01))

添加括号和参数来修复:

#define TEST0(i) ((i)&0x01)
#define CLEAR0(i) ((i) &= 0x01)
于 2013-01-26T19:59:12.303 回答
0

如果要将参数传递给宏,则应将其定义为接受参数:

#define TEST0(i) ((i)&0x01)
#define CLEAR0(i) do { i&=0x01; } while(0)

(其他修改处理优先级和语法)。

于 2013-01-26T20:01:15.803 回答