【问题标题】:Macro variadic argument宏变量参数
【发布时间】:2019-02-12 10:17:44
【问题描述】:

我有这个代码:

std::string format(const char *fmt, ...);

#define DEBUG(HANDLER, LEVEL, ...) LOG##LEVEL(HANDLER, format(__VA_ARGS__))

当我使用它时它工作:

DEBUG(handler, DEBUG, "var is %d\n", 15);

但是当我使用时它不起作用:

DEBUG(handler, DEBUG, "test");

如何检查是否只有一个参数或多个参数?
我只需要使用 C++98 解决方案。

【问题讨论】:

  • 你不能。您需要以您的格式或通过一些其他变量传递该信息。
  • @JoeyMallone 我可以修改格式功能,但是如何?
  • __VA_ARGS__是C++11引入的,所以在C++98中无法实现
  • @MichaelVeksler,我使用C++03,我使用__VA_ARGS__:) 我正准备用__VA_OPTS__ 测试你的答案,因为我不知道,但你删除了它。
  • @MatthieuBrucher 你是对的,这就是我删除答案的原因。但是,由于__VA_ARGS__ 可用于 OP 的 C++98 编译器(尽管是 C++11 功能),它也可能具有 __VA__OPT__ 作为扩展的一部分

标签: c++ c++98


【解决方案1】:

所以,我查看了您的问题并查看了您的代码,我意识到这可能是 臭名昭著的 XY 问题的一个案例。

虽然你说,你想计算传递给宏的参数的数量,你想要做的是编写调试消息,除了将调试消息声明为的文字字符串之外没有任何其他参数您在示例中显示。

DEBUG(handler, DEBUG, "test");

但这当然是可能的。为了测试它,我编写了以下代码。

std::string format(const char* fmt, ...) {
    char buffer[256];
    std::cout << __FUNCTION__ << std::endl;
    va_list argList;
    va_start(argList, fmt);
    vsprintf(buffer, fmt, argList);
    va_end(argList);
    return std::string(buffer);
}

#define TRC(...) {\
    std::cout << "MACRO!" << std::endl; \
    std::cout << format(__VA_ARGS__);\
}

int main()
{
    std::cout << "Hello World!" << std::endl;
    const char *t = "b";
    TRC("[%s] bla bla [%d]\n", t, 9);
    TRC("test");
    return 0;
}

产生输出,

世界你好!
宏!
格式
[b] bla bla [9]
宏!
格式
测试

就像我之前在 cmets 中提到的你的问题,我有 C++03 编译器,但我猜这也应该适用于 C++98。

问题:

“如何检查是否只有一个参数或多个参数?”

可变参数宏本身不管你有一个参数还是多个参数都没有问题。

但如果你真的还想计算传入的参数数量,我不知道在C++03 或更早的时候这样做。

【讨论】:

    【解决方案2】:

    由于 __VA__ARGS__ 在您的 C++98 编译器上可用(尽管是 C++11 feature),所以它也有可能将 __VA_OPT__ 作为扩展名:

    您应该使用__VA_OPT__(something)(这是 C++20 的一项功能)使逗号仅在至少有一个参数时出现:

    #define DEBUG(HANDLER, LEVEL, ...) LOG##LEVEL(HANDLER __VA_OPT__( format(__VA_ARGS__)))
    

    或适用于您的情况的类似内容。

    【讨论】:

      猜你喜欢
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 2010-10-15
      • 2014-10-01
      • 2011-09-11
      • 1970-01-01
      相关资源
      最近更新 更多