宏可变参数

时间:2019-02-12 10:17:44

标签: c++ c++98

我有此代码:

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 解决方案。

2 个答案:

答案 0 :(得分:1)

由于__VA__ARGS__在其他C ++ 98编译器上可用(尽管是http://pandas.pydata.org/pandas-docs/stable/io.html#reading-tables),所以有可能它也以__VA_OPT__作为扩展名:

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

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

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

答案 1 :(得分: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]
  宏!
  格式
  测试

就像我之前在对您的问题的评论中提到的那样,我有C++03编译器,但是我猜这也适用于C ++ 98。

问题:

  

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

可变参数宏本身没有问题,无论您有一个还是多个。

但是,如果您真的仍然想计算传入的参数数量,我不知道在C++03或更早的版本中这样做。