类函数宏 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`。
我经常搞不清楚是使用类对象宏还是类函数宏。 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`。