好吧,这真的不难,但经过多次尝试,我找不到任何解决方案。
如何将格式化字符串传递给1行中的函数?我想有一个简单的方法,我可以用于记录/调试目的,如下所示:
void debug(string s){
if (DEBUG) cerr << s;
}
我希望能够将格式化的字符串发送到此函数,如下所示:
debug("reading %s" % fname);
我的主要目标是在调试方法中加入尽可能多的功能,这样每当我想把东西写入stderr时,我就可以让生活变得更轻松。
printf解决方案似乎需要大量的代码来进行简单的格式化,而boost :: format似乎会返回一些模糊的类型,这些类型不能轻易用作参数而不包含一些.str()内容。
我是否懒得成为一名C ++程序员,还是有一种完整的方法可以实现我尚未发现的目标?
答案 0 :(得分:4)
您可以使用__VA_ARGS __:
在fprintf周围定义宏#define DBGLOG(format, ...) if(DEBUG){ fprintf(stderr, "%s -- %d -- ", __FUNCTION__, __LINE__); fprintf(stderr, format, ##__VA_ARGS__);}
如果DEBUG为真,则输出函数名称和行号,然后输出您想要打印的内容。
例如:
DBGLOG("%d\n", some_integer);
这会将函数和行号添加到整数值并打印出来。
答案 1 :(得分:1)
您可以编写一个接受格式的函数并将其传递给您的其他函数:
void debug( std::string s )
{
if (DEBUG) cerr << s;
}
void debug( boost::format format )
{
debug( format.str() );
}
答案 2 :(得分:0)
这里的普通C ++解决方案略有不同:您的debug
函数应返回std::cerr
周围的包装器(或任何
其他输出流),类似于:
class OStreamWrapper
{
std::ostream* myStream;
public:
OStreamWrapper( std::ostream* init ) : myStream( init ) {}
template <typename T>
OStreamWrapper& operator<<( T const& value )
{
if ( myStream != nullptr ) {
*myStream << value;
}
}
};
OStreamWrapper
debug()
{
return OStreamWrapper( DEBUG ? &std::cerr : nullptr );
}
然后使用它:
debug() << "reading " << fname << '\n';
这具有实际转换的附加优势 除非调试,否则不需要格式化输出 活性