我经常对是否使用类似对象或类似函数的宏感到困惑。我写过两篇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()?
如果有人在使用这种方式或其他方式时有所了解,我们将不胜感激。
答案 0 :(得分:3)
#define ORED (FIRST | 5)
这里,ORED
是一个类似对象的宏,因为它是在没有参数列表的情况下定义的。试试吧:
ORED → (FIRST | 5)
ORED() → (FIRST | 5)() // Error: Object 5 not callable
宏的使用取决于它的定义方式。但是对于宏有一个特殊的规则:必须在宏名称之后立即给出宏的参数列表的左括号。宏名称和括号之间的空格字符定义了类似对象的宏:
#define MACRO(X) // function-like macro hat expands to nothing
#define MACRO (X) // object-like macro that expands to (X)
大多数编译器让您看到预处理后的代码,即宏扩展后的代码。 gcc
有-E
标记,Microsoft cl
有'/ E`。