我有这个日志记录系统,我正在寻找一些字符串操作的快捷方式。
日志系统通过功能宏使用,然后转发到单个函数调用。例如#define Warning(...) LogMessage(eWarning, __VA_ARGS__);
。
然后 LogMessagesnprintf
进入一个新的缓冲区,然后将该消息呈现给碰巧安装的任何日志目标;printf、OutputDebugString 等
不幸的是,我遇到了一个问题,我们拥有的缓冲区不够大,因此输出被截断。我还意识到,如果输出消息中包含百分比符号,此方法将失败,因为 snprintf 将尝试处理 va_args。最后,由于我们的大多数日志消息不使用 va_args,复制字符串只是为了将其呈现给记录器似乎很愚蠢。
所以-给定我的函数原型,我是否应该能够根据省略号的存在来重载?换句话说,我是否应该能够假设我可以做类似的事情:
LogMessage(LogLevel, const char* message, ...);
LogMessage(LogLevel, const char* message);
我的谷歌尝试并没有产生任何特别有用的东西(只是告诉我,如果没有其他方法,椭圆将匹配,与我的要求不同,没有任何匹配),我最初的实现只是给了我一个模棱两可的函数调用错误。
有了这个错误,我应该接受我不能这样做,但我想知道这只是我正在使用的编译器,还是我做错了。我可以达到类似的效果
// edited version of what I really have to remove our local APIs,
// please excuse minor errors
const char* message = NULL;
char buffer[512];
va_list args;
va_start(args, format);
if(strcmp(format, "%s") == 0) {
message = va_arg(args, const char*);
}
else if (strchr(format, '%') == NULL) {
message = format;
}
else {
vsnprintf(buffer, 512, format, args);
message = buffer;
}
va_end(args);
...但这在典型情况下似乎很浪费,只需通过传递的参数数量即可知道。例如,如果省略号不匹配任何内容,请选择其他函数?如果这不起作用,我可以尝试另一种方法,不需要用户用宏名称来决定将调用哪个函数?老实说,一旦我意识到如果有人Error("Buffer not 100% full");
在他们的日志消息中随意说出并得到“缓冲区不是 1007.732873e10ull”,那么“浪费”就不再那么重要了。
编辑:虽然我的例子已经回答了“不要那样做”,但问题本身可以回答吗?