`
ihuashao
  • 浏览: 4548270 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

变长参数的 Tracer

阅读更多

几天前,在CSDN论坛看到这么一则讨论:在宏定义中怎么使用可变参数?(http://expert.csdn.net/Expert/topic/2925/2925165.xml)。楼主希望能定义这样的macro:

#define fun1(a, b, ...) fun2(__FILE__, __LINE__, a, b, ...)

我猜楼主是想写trace,如果不能使用可变参数的macro,那么就得像MFC那样写一堆TRACE macros:


// 取自 MFC 7.1 的 afx.h
// 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 <stdarg.h><br>#include <stdio.h></stdio.h></stdarg.h>

#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 通过。

分享到:
评论

相关推荐

    Cisco Packet Tracer 5.3 思科路由器交换机模拟软件

    Cisco Packet Tracer 5.3 思科路由器交换机模拟软件 Cisco Packet Tracer 5.3 思科路由器交换机模拟软件 Cisco Packet Tracer 5.3 思科路由器交换机模拟软件 Cisco Packet Tracer 5.3 思科路由器交换机模拟软件 ...

    Statement Tracer for Oracle

    Statement Tracer for Oracle绿色

    vrrp packetTracer 配置

    思科模拟器Cisco Packet Tracer 的vrrp 配置手册,很详细

    Cisco Packet Tracer 7.1.1

    版本比较新的Packet Tracer,路由方面支持更多命令,交换方面命令齐全。

    10.8.1.2 Packet Tracer

    Packet Tracer 命令行配置

    网络原理实验报告(使用网络模拟器packetTracer)

    一、实验名称 使用网络模拟器packetTracer 二、实验目的: 1. 掌握安装和配置网络模拟器PacketTracer的方法; 2. 掌握使用PacketTracer模拟网络场景的基本方法,加深对网络环境,网络设备和网络协议交互过程等方面的...

    Packet Tracer 入门.ppt

    Packet Tracer 入门

    cisco packet tracer 6.0

    cisco packet tracer 6.0 使用前要更改系统时间.改为2013年3月18日 http://hi.baidu.com/yanzi52351 思科官方CCNA模拟器PT6最新版下载(PacketTracer6) 最新的PT,可以做部分NP实验 PacketTracer60_Build28_setup....

    PacketTracer实验成品

    PacketTracer实验成品PacketTracerPacketTracer实验成品实验成品PacketTracer实验成品

    packet tracer 5.0教程

    本文针对网络实验课特点引入packet tracer 5.0完善并提高教学效果,通过配置ospf单区域和多区域路由为例,来说明该网络模拟软件所带来的方便性和实用性。首先介绍该软件的安装和汉化问题,然后详细解释了如何配置ospf单...

    PacketTracer使用教程

    PacketTracer使用教程~~~~~~PacketTracer使用教程

    Cisco Packet Tracer 8.2.2 X64

    当系统提示您登录并使用 Cisco Packet Tracer 8.2.2 时,在登录服务器下拉框中选择China 。 然后单击蓝色的 Cisco Networking Academy 图标开始登录过程。 在登录屏幕中输入所需的详细信息。 当登录屏幕关闭时,您已...

    raytracer_tutorials

    raytracer_tutorials.

    packet tracer 5.3 安装版4

    Packet Tracer 5.3是一款非常不错的Cisco(思科)网络设备模拟器,对于想考思科初级认证(如CCNA)的朋友们来说,Packet Tracer 5.3是非常不错的选择。通常我们周围并没有那么多思科的设备供我们学习调试,参加培训...

    Cisco Packet Tracer 7.2.2 x32

    思科模拟器Cisco Packet Tracer7.2.2 x32 Cisco Packet Tracer 7.2.2 new features Cisco Packet Tracer 7.2.2 removes the Java dependence and makes it easier to use Packet Tracer Skills Assessment (PTSA) ...

    Packet Tracer 3.0 含Packet Tracer文件

    Packet Tracer 是由Cisco公司发布的一个辅助学习工具,为学习思科网络课程的初学者去设计、配置、排除网络故障提供了网络模拟环境。用户可以在软件的图形用户界面上直接使用拖曳方法建立网络拓扑,并可提供数据包在...

    PacketTracer5手册

    思科Packet Tracer 5模拟器使用手册

    PacketTracer5.3

    PacketTracer5.3 PacketTracer5.3 PacketTracer5.3 PacketTracer5.3 PacketTracer5.3

    11.6.1 Packet Tracer - Switch Security Configuration

    11.6.1 Packet Tracer - Switch Security Configuration Cisco Packet Tracer 思科模拟器 正确答案文件 可直接上交正确答案文件 本答案版权归mewhaku所有,严禁再次转载!!! Copyright @mewhaku 2022 All ...

Global site tag (gtag.js) - Google Analytics