【问题标题】:Universal macro which can have zero or one parameter [duplicate]可以有零个或一个参数的通用宏[重复]
【发布时间】:2013-03-06 14:29:54
【问题描述】:

有没有办法定义可以有一个或零个参数的宏?

我需要在这个例子中使用一些东西:

#define MY_RETURN(ret) return ret;

void foo(){
    MY_RETURN();
}

int foo_integer(){
    MY_RETURN(1);
}

我无法找到解决方案。

【问题讨论】:

  • 有理由反对这两种可能的重复。这部分取决于“0 或 1”参数要求的严格程度。解决方案倾向于允许“0 个或多个”参数,而不仅仅是“0 或 1”。

标签: c macros c-preprocessor


【解决方案1】:

在 C99 及更高版本中,可以使用可变参数宏。

C11 (n1570), § 6.10 预处理指令

# define identifier lparen identifier-list , ... ) replacement-list new-line

您的宏可能类似于:

#define MY_RETURN(...) return __VA_ARGS__

如果你需要计算参数,你可以查看here

【讨论】:

  • 我也在考虑同样的想法,不幸的是,我必须使用旧的 Borland 编译器为 DOS 编程。你确定你的语法是正确的吗?如果是,我会将其标记为答案。
  • @Mihalko:好吧,如果您的编译器不支持 C99,您可以查看他提供的扩展。此语法是正确的,但(不幸的是)在 C89 中除外。
  • 谢谢。从这些天开始,这对编译器来说绝对是有用的信息:)
  • __VA_ARGS__ 表示法允许 2 和 3 以及 ... 参数与 0 或 1 相同。这可能重要,也可能不重要。
【解决方案2】:

定义两个 MY_RETURN 宏,一个带参数,一个不带!一种重载,但适用于宏。

【讨论】:

  • 那是对宏的重新定义。
【解决方案3】:

根据How to define macro function which support no input parameter and support also input parametr in the same time的回答

考虑这样的事情:

#define MY_RETURN(ret) { \
  int args[] = {ret}; \
  if(sizeof(args) > 0) \
    return ret; \
}

【讨论】:

  • 不编译。
猜你喜欢
  • 2015-05-09
  • 2011-01-02
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 2014-05-11
  • 2016-06-04
  • 2018-04-20
  • 1970-01-01
相关资源
最近更新 更多