1

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

因此,我决定将可变参数功能隐藏在 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);
}

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

4

1 回答 1

1

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

但是,对于一般情况,您可能会考虑:

1) 提升::格式

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

于 2011-08-11T17:16:48.873 回答