类函数宏 vs 类对象宏

Function-like macro vs Object-like macro

我经常搞不清楚是使用类对象宏还是类函数宏。 here 我都写过。因此,如果类对象宏的替换列表可以是文字或文字列表。那么如果我们在标识符后面有一个表达式,我们应该使用类似函数的宏吗?

#define FIRST    1  //object-like
#define INCREASE_A_AND_B()    do{++a;++b;}while(0)  //functuion-like
#define ORED     (FIRST | 5)  //func or object? ORED or ORED()?

如果有人阐明何时使用其中一种或另一种方式,我们将不胜感激。

#define ORED     (FIRST | 5)

这里,ORED是一个类对象宏,因为它是在没有参数列表的情况下定义的。试试看:

ORED        →   (FIRST | 5)
ORED()      →   (FIRST | 5)()    // Error: Object 5 not callable

宏的使用取决于它的定义方式。不过,宏有一条特殊规则:宏参数列表的左括号必须紧跟在宏名称之后。 Space 宏名和括号之间的字符定义了一个类对象宏:

#define MACRO(X)    // function-like macro hat expands to nothing
#define MACRO (X)   // object-like macro that expands to (X)

大多数编译器让您看到预处理后的代码,即宏展开后的代码。 gcc-E 标志,微软的 cl 有 ´/E`。