gpt4 book ai didi

c++ - 宏可变参数

转载 作者:搜寻专家 更新时间:2023-10-31 02:03:53 25 4
gpt4 key购买 nike

我有这个代码:

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

最佳答案

所以,我看了你的问题和你的代码,我意识到这可能是臭名昭著的 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;
}

产生输出,

Hello World!
MACRO!
format
[b] bla bla [9]
MACRO!
format
test

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

问题:

"How can I check if there's only one argument or more than one?"

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

但如果您真的真的仍然想计算传入的参数数量,我不知道 C++03 或更早版本是否可以做到这一点。

关于c++ - 宏可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54647718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com