变长参数的 Tracer

2d-tracer ps 在.html文件中包含canvas.js,它将引导一个画布以及随附的update()和draw()函数。 开发人员只需添加customUpdate()和customDraw()方法即可在网页中进行实时(潜在交互)可视化。 有关如何包含ps.js以及如何添加自定义方法的示例,请参见index.html。 您可以通过从rawgit.com包含canvas.js。 立即下载

几天前,在优快云论坛看到这么一则讨论:在宏定义中怎么使用可变参数?(http://expert.youkuaiyun.com/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
#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 通过。

tracer:简单的记录器 安装 npm install @hiryus-org/tracer 用法 // Import library const tracer = require ( 'tracer' ) ; // By default, event message is output as text on the console for all default // levels (fatal, error, warning, info, debug, trace and access). // See "configuration" section to change it. // The log event, you can use the log() function: // tracer.log(level, message, [metadata]) tracer . log ( 'info' , 'a 立即下载

相关推荐

字符集的选择

字符集的选择 一:背景介绍 DICOM特定字符集(0008,0005) 此标签获得不同的值就代表使用不同的语言进行解码。 以下为多家CT厂商的(0008,0005)取值: 字符集: unicode是字符集,ASCII、GB2312、GBK、GB18030既是字符集也是编码方式,UTF-8只是编码方式。 二:中文字符集介绍 世界通用字符集——UTF 中文字符集——GB2312、GBK、GB18030 字符集的详细介绍 一:UTF-8 程序是把一个字节一个字节的来读取,然后再根据字节中开头的bit

qq_41972968的博客 1520

博客是真的好用,各种各样的资源都有,很棒。

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

qq_43673113的博客 405

LangChain入门(二)-通过 Google 搜索并返回答案

并复制他给我们生成 api key。(博主使用了GitHub账号登录)-邮箱验证-手机号验证-订阅-api-key。Serpapi 提供了 google 搜索的 api 接口。首先需要我们到 Serpapi 官网上注册一个用户,

Good Luck 1万+

Turtle库学习--动画控制与屏幕事件

turtle.delay(delay=None) 参数 delay – 正整型数 设置或返回以毫秒数表示的延迟值 delay。(这约等于连续两次画布刷新的间隔时间。) 绘图延迟越长,动画速度越慢 turtle.tracer(n=None, delay=None) 参数 n – 非负整型数 delay – 非负整型数 启用/禁用海龟动画并设置刷新图形的延迟时间 如果指定 n 值,则只有每第 n 次屏幕刷新会实际执行 如果调用时不带参数,则返回当前保存的 n 值。第二个参数设置延迟值 turtle.update

hide_in_darkness的博客 3415

告别Keil/IAR:在VSCode中用CMake+Clangd打造丝滑的STM32开发环境(附完整配置)

本文详细介绍了如何在VSCode中使用CMake和Clangd搭建高效的STM32开发环境,替代传统的Keil/IAR工具。通过完整的配置指南和快速开发技巧,帮助开发者实现轻量级、高度可定制的现代化开发流程,显著提升STM32项目的开发效率。

weixin_26843605的博客 166

agent-browser OpenClaw 的最佳搭档

agent-browser 是专为 AI Agent 设计的浏览器自动化工具,目前被公认为 OpenClaw 的最佳配套方案。这份技术文档完整记录了其架构、协议、性能调优与常见问题处理,非常适合想让OpenClaw 真正“上手”互联网的开发者与老用户。

liu_zhiyi的博客 1781

Resources for Beginning Graphics Programming

https://medium.com/vrtigo/resources-for-beginning-graphics-programming-c0da724381bc   I am frequently asked where to begin learning graphics programming and what resources I recommend. Without the g...

poem_of_sunshine的专栏 882

社会网络仿真软件:NetLogo_(14).社会网络数据导入与导出

在NetLogo中,社会网络的仿真不仅依赖于模型的内部逻辑,还需要能够灵活地导入和导出数据。这使得用户可以利用外部数据来初始化模型,或者将模型的运行结果导出以便进一步分析。本节将详细介绍如何在NetLogo中实现社会网络数据的导入和导出,包括常见的数据格式和具体的代码示例。

kkchenjj的博客 600

PictureFun合成作品欣赏(1)

有时候,我们希望活在那个P出来的世界PictureFun的Youtube频道https://www.youtube.com/channel/UCwqbc...

qq_41176800的博客 3241

java.sql.SQLIntegrityConstraintViolationException: #23000

java.sql.SQLIntegrityConstraintViolationException: #23000**异常信息****异常原因****解决方法** 异常信息 ### Cause: java.sql.SQLIntegrityConstraintViolationException: #23000 ; #23000; nested exception is java.sql.SQLIntegrityConstraintViolationException: #23000] with root c

123 4354

机床上位机实战:CNC设备数据采集+工艺参数存储全流程(附C#代码+SQL设计)

如果能正常输出转速和状态,说明通信通了——这步是基础,没通的话别往下走,先查CNC的IP对不对、Modbus功能有没有开、地址是不是错了(我当初卡了2小时,发现是Fanuc的Modbus从站地址设成了2,不是默认1)。这篇文章就把整个开发过程拆透:从CNC通信协议选型,到数据采集代码落地,再到工艺参数的数据库设计,连中间踩过的“Fanuc系统寄存器地址对应错”“断连后数据补传”这些坑都给大家说清楚,新手跟着做也能跑通。工艺参数要跟“工单”和“设备”绑定,不然查的时候不知道是哪个工单、哪台设备的参数。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 792

C/C++ 中宏与预处理使用方法大全 (VC)

原文:C/C++ 中宏与预处理使用方法大全 (VC) 作者:Breaker <breaker.zy_AT_gmail> C/C++ 中的宏 (#define) 与预处理 (#if/#ifdef/#pragma) 的使用方法大全、使用技巧 开发环境:VC 2005 关键字:宏, 预定义宏, 预处理, 预编译头, VC, #pragma, 编译选项, 程序区段 RTFM: Re...

爱.NET 1081

Python 爬虫实战:在丁香医生抓取健康科普文章阅读量,普及健康知识

requests:用于发送 HTTP 请求,获取网页内容。或 lxml:用于解析 HTML 页面,提取目标数据。pandas:用于数据清洗和分析。matplotlib和seaborn:用于数据可视化。通过本项目,我们实现了以下目标:使用 Python 爬虫抓取丁香医生的健康科普文章阅读量。对数据进行清洗和分析,找出热门文章。通过可视化展示数据,并普及健康知识。

u014481728的博客 1567
上一篇: Linux 下配置 802.1X
下一篇: LaTeX 常用功能
陈硕
博客等级 码龄26年 1万+粉丝 144原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值