我正在查看老师给我的代码,我发现了这个:
#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陈述是自解释的,但我对第三个问题有所了解.第三个陈述(行)是对的吗?我们可以用分号(;)后写语句,如果是,那么请你解释一下这里发生了什么.
分号可以在宏定义中使用,并且只会使宏扩展为多个语句:
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))(这是非法的,因为你不能在函数调用中使用分号).
| 归档时间: |
|
| 查看次数: |
298 次 |
| 最近记录: |