【问题标题】:Function-like macro vs Object-like macro类函数宏与类对象宏
【发布时间】:2016-03-21 09:03:08
【问题描述】:

我经常混淆是使用类对象宏还是类函数宏。我写过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()?

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

【问题讨论】:

  • 让符号更熟悉。
  • 请解释否决票。

标签: c c-preprocessor


【解决方案1】:
#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`。

【讨论】:

  • 参数列表不是强制性的。您可能有没有参数的类似函数的宏。
  • 一个空的参数列表(如你的INCREASE_A_AND_B)也是一个参数列表。如果你使用这样一个不带括号的宏,它就不会被扩展。类对象和类函数的区别在于宏定义中存在参数列表。
  • 我现在明白了 :) 谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 2015-08-04
  • 2020-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多