变长参数的 Tracer
来源:互联网 发布:windows恢复错误怎么办 编辑:程序博客网 时间:2024/05/17 02:38
// The following trace macros are provided for backward compatiblity
// (they also take a fixed number of parameters which provides
// some amount of extra error checking)
#define TRACE0(sz) TRACE(_T("%s"), _T(sz))
#define TRACE1(sz, p1) TRACE(_T(sz), p1)
#define TRACE2(sz, p1, p2) TRACE(_T(sz), p1, p2)
#define TRACE3(sz, p1, p2, p3) TRACE(_T(sz), p1, p2, p3)
太丑陋了!还好,C99标准支持Variadic Macros,在GCC中,可以这么写:
// http://gcc.gnu.org/onlinedocs/gcc/Variadic-Macros.html
#define debug(format, ...) fprintf(stderr, format, __VA_ARGS__)
还可以顺便打印文件名和行号:
#define debug(format, ...) do {/
fprintf(stderr, "%s (%d): ", __FILE__, __LINE__);/
fprintf(stderr, format, __VA_ARGS__);/
} while (0)
但可惜Visual C++ 7.1还不支持这项功能:( 不过我们在C++中至少可以绕弯解决,做到既能自动记录文件名和行号,又能使用变长参数调用。这个办法不是我独创的,实际上ATL的atltrace.h中就有它的实现(CtraceFileAndLineInfo class),我在Code Project也找到了相同的实现(http://www.codeproject.com/debug/location_trace.asp),甚至在CUJ的C++ Experts Forum 也能看到相近的做法(http://www.cuj.com/documents/s=8250/cujcexp2106alexandr/),当然Alexandrescu的办法技巧性更强。
思路:写一个重载了 operator() 的class,令 TRACE 宏返回该class的一个object:
#include
#include
#ifndef NDEBUG // debug mode
class tracer
{
public:
tracer(const char* file, int line)
: file_(file), line_(line)
{}
void operator()(const char* fmt, ...)
{
va_list ap;
// print the file name and line number
fprintf(stderr, "%s (%d): ", file_, line_);
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
fprintf(stderr, "/r/n"); // print the new-line character
}
private:
// copy-ctor and operator=
tracer(const tracer&);
tracer& operator=(const tracer&);
private:
const char* file_;
int line_;
};
#define TRACE (tracer(__FILE__, __LINE__))
#else // NDEBUG
#define TRACE (void)
#endif // NDEBUG
int main()
{
#ifndef NDEBUG
tracer(__FILE__, __LINE__)("%x", 123);
#endif
TRACE("%s", "Happy debugging.");
}
这样做是multithreading-safe的。G++ 3.3.1 / Visual C++ 7.1 / Borland C++ 5.5.1 通过。
http://blog.csdn.net/Solstice/archive/2004/04/29/565.aspx
- 变长参数的 Tracer
- 变长参数的 Tracer
- 变长参数的 Tracer
- 变长参数的 Tracer
- 变长参数的 Tracer
- 变长参数的 Tracer
- 变长参数的 Tracer
- 变长参数的 Tracer
- 变长参数的 Tracer
- 变长参数的 Tracer
- 变长参数的 Tracer
- 变长参数的 Tracer
- 变长参数的 Tracer
- 变长参数的实现
- 变长参数的使用
- 函数的变长参数
- 变长参数的函数
- 变长参数的函数
- 广告和间谍程序克星Spybot使用说明
- 国内最丰富的资源网站(ZT)
- 偷偷的想你(转载)
- 爱情和婚姻哲理(转载)
- 甲申三百年祭(郭沫若著)
- 变长参数的 Tracer
- CRM软件系统的结构功能分析
- 数字域名判断 ,版本2
- Java 6新特性一箩筐,将提供中文化的API文档
- 下次,我一定说出来!
- c#.net常用的小函数和方法集
- 跟我学XSL(一)(转)
- 一点感想……
- 新申请了个网络硬盘