所以我想知道什么时候使用
#define xxx (yyy)
Run Code Online (Sandbox Code Playgroud)
VS
#define xxx yyy
Run Code Online (Sandbox Code Playgroud)
我的项目包括一个在AD0_ADMD_CT上有自己定义的文件,如果我想重新定义它们,我需要在定义中使用(AD0_ADMD_CT)或AD0_ADMD_CT吗?
AD0_ADMD_CT定义为
#define AD1_ADMD_CT (IO_AD1.ADMD.bit.CT)
Run Code Online (Sandbox Code Playgroud)
所以它也是
#define AD0_COMPARETIME (AD0_ADMD_CT)
Run Code Online (Sandbox Code Playgroud)
要么
#define AD0_COMPARETIME AD0_ADMD_CT
Run Code Online (Sandbox Code Playgroud)
两者都没有区别.在第一种情况下XXX被替换yyy,并通过(yyy)为第二种情况.使用包围的惯例是避免可能发生的逻辑错误.例如,您将添加功能定义为:
#define f(N) N+N
int a = f(5)*f(5)
Run Code Online (Sandbox Code Playgroud)
预期值为10*10 = 100,但输出为35,因为在编译时变为
int a = 5+5*5+5, 所以使用运算符首选项规则,输出更改.
所以括号避免了这些类型的错误.
通过添加括号,您将强制在宏主体的其余部分之前评估括号内的参数,因此如果您有
#define MULT(x, y) (x) * (y)
// now MULT(3 + 2, 4 + 2) will expand to (3 + 2) * (4 + 2)
Run Code Online (Sandbox Code Playgroud)
它似乎不会影响您当前的情况,除非您的宏有更多内容。