我们的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);
}
这可以吗?这个问题有更好的解决方案吗?感谢。
答案 0 :(得分:1)
Python使得在Python中组装格式化字符串变得微不足道,所以我只提供简单的“给我一个字符串并记录它”错误。
但是,对于一般情况,您可以考虑:
1)boost :: format
2)通过创建一个包含std::stringstream
成员的类来模拟iostream接口,重载operator<<
以转发到stringstream的operator<<
,然后添加一些其他方法来实际记录“缓冲区”内容(一种方法是登录对象的析构函数 - 使其不可复制可能是一个好主意 - 所以你可以做类似Logger() << "foo" << bar;
的事情 - 临时对象的生命周期延长到该行,运算符重载构建缓冲区内容,然后dtor运行并输出字符串流的.str()
到。)