gpt4 book ai didi

c++ - 非可变参数的 printf 风格记录器

转载 作者:太空宇宙 更新时间:2023-11-04 12:17:24 28 4
gpt4 key购买 nike

我们的 C/C++ 项目正在使用一个新的内部脚本,它自由地包装了 SWIG 中的每个函数,以供 python 脚本使用。它阻塞了我们的记录器函数,因为 SWIG 不能很好地包装可变参数函数。

因此,我决定将可变参数功能隐藏在 SWIG 永远不会出错的宏中,如下面的简化示例所示:

#include <iostream>

void LogPrint(char *file, int line, char* msg)
{
std::cout << file << ":" << line;
std::cout << " [ " << msg << " ] ";
std::cout << std::endl;
}

#define MAX_LOG 256

#define LogPrintf(msg, args...) \
{ \
char *msg_buffer = new char[MAX_LOG]; \
snprintf(msg_buffer, MAX_LOG, msg, ##args); \
Log(__FILE__, __LINE__, msg_buffer); \
delete [] msg_buffer; \
}

main()
{
LogPrintf("%s = %f", "tau", 6.28318);
LogPrintf("%s = %f", "pi", 3.14159);
}

这样可以吗?这个问题有更好的解决方案吗?谢谢。

最佳答案

Python 使得在 Python 中组装格式化字符串变得微不足道,所以我只提供简单的“给我一个字符串,我记录它”错误。

不过,对于一般情况,您可能会考虑:

1) 升压::格式化

2) 通过创建一个包含 std::stringstream 的类来模拟 iostream 接口(interface)成员,重载operator<<转发到 stringstream 的 operator<< ,然后添加一些其他方法来实际记录“缓冲区”内容(一种方法是记录对象的析构函数 - 使其不可复制可能是个好主意 - 所以你可以做类似 Logger() << "foo" << bar; 的事情 -临时对象的生命周期被延长到行尾,运算符重载建立缓冲区内容,然后 dtor 运行并将字符串流的 .str() 输出到任何地方。

关于c++ - 非可变参数的 printf 风格记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7030051/

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