【问题标题】:Macro inside a Function and stringfication函数内的宏和字符串化
【发布时间】:2017-06-22 11:52:20
【问题描述】:

我有以下函数foo()和宏FOO(str)

void foo(const char *fmt, ...) {
   va_list args;
   va_start(args,fmt);
   vsprintf(msgbuff,fmt,args);
   va_end(args);
   printf("%s\n",msgbuff);
}

#define FOO(str)\
foo str;           // No need of brackets as they are coming in 'str'

我曾经像下面这样调用宏:

FOO(("My %s is %s\n","Name","Bala"));

现在我的要求是:

FOO(str) 不应直接调用我的函数foo(),而应通过另一个函数(如func())调用它。

最后我的宏应该如下所示

#define FOO(str)\
func(#str) // Do I need to Stringizing str? 

我的问题是,如何从func() 内部调用函数foo()? 请提出任何可能的实施方案。

【问题讨论】:

  • 听起来你需要一个可变参数宏。
  • 你为什么要使用宏?当函数也可以完成工作时,切勿使用宏!并且宏的第一个版本具有误导性并混淆了您的代码。
  • 请提供func()的定义。
  • 嗨 olaf,我只更改了我现有项目中宏的内部实现。所以我不能改变宏的用法。我只能改变它的实现
  • 嗨 kampling ,例如我说过 func()。实际上我需要知道如何在 func() 中调用 foo()

标签: c c-preprocessor stringification


【解决方案1】:

你可以使用可变参数宏

#define FOO(...) \
fun(__VA_ARGS__);

然后这样称呼它

FOO("A", "B", "C")

编辑:

正如 Olaf 所指出的,不鼓励这样做,可以用直接函数调用代替

【讨论】:

  • 这个问题没有说明使用可变数量的参数。即使给定一个宏是不必要的,因此强烈建议不要这样做。
  • @lapinozz:他用 C 而不是 C++ 标记了他的问题。
  • 对,傻我
  • 我没有指出宏没用(或几乎没用)。主要问题仍然存在:没有可变参数。
  • 嗨,问题是我只能像这样使用宏 - FOO(("My %s is %s\n","Name","Bala")); .... 我需要从函数 func() 调用 foo()。
猜你喜欢
  • 2021-05-23
  • 2018-05-06
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 2012-07-21
  • 2013-11-28
相关资源
最近更新 更多