C宏表达式返回值

时间:2013-01-26 19:57:40

标签: c macros bit-manipulation bitmask

我正在为我的嵌入式系统类编写设备处理程序,我正在尝试使用宏来检查第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;
}

3 个答案:

答案 0 :(得分:3)

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

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

另外,为了安全起见,请使用空格来表示可读性和括号。

答案 1 :(得分:1)

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

它被解析如下:

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

添加parens和一个参数来修复:

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

答案 2 :(得分:0)

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

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

(其他修改涉及优先级和语法)。