类似函数的宏与类似Object的宏

时间:2016-03-21 09:03:09

标签: c c-preprocessor

我经常对是否使用类似对象或类似函数的宏感到困惑。我写过两篇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()?

如果有人在使用这种方式或其他方式时有所了解,我们将不胜感激。

1 个答案:

答案 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`。