在定义预处理程序语句中使用括号

Chr*_*iki 5 c c-preprocessor

所以我想知道什么时候使用

 #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)

Sha*_*mar 6

两者都没有区别.在第一种情况下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, 所以使用运算符首选项规则,输出更改.

所以括号避免了这些类型的错误.


Bri*_*ian 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)

它似乎不会影响您当前的情况,除非您的宏有更多内容。