#define语句解释

Moh*_*hit 0 c c-preprocessor

我正在查看老师给我的代码,我发现了这个:

#define setBit(var, bitnum)   (var)|=(1<<(bitnum))
#define resBit(var, bitnum)   (var)&=~(1<<(bitnum))
#define ROW_RESET       setBit(PORTA,4) ; resBit(PORTA,4)
Run Code Online (Sandbox Code Playgroud)

前两个#define陈述是自解释的,但我对第三个问题有所了解.第三个陈述(行)是对的吗?我们可以用分号(;)后写语句,如果是,那么请你解释一下这里发生了什么.

Aas*_*set 6

分号可以在宏定义中使用,并且只会使宏扩展为多个语句:

ROW_RESET;
Run Code Online (Sandbox Code Playgroud)

将扩大到

setBit(PORTA,4) ; resBit(PORTA,4);
Run Code Online (Sandbox Code Playgroud)

只要扩展后的结果在语法上有效(在扩展时),也允许在宏定义中使用带花括号的块语句.

像往常一样,你在宏中做的更"花哨"的东西,更容易弄错 - 例如,如果你有一个带签名的函数void foo(int),你可以调用foo(setBit(PORTA, 4)),但foo(ROW_RESET)不会编译,因为它会扩展to foo(setBit(PORTA,4) ; resBit(PORTA,4))(这是非法的,因为你不能在函数调用中使用分号).