首页 / 知识
关于c ++:如何创建带有可变参数列表的仅调试函数? 就像printf()
2023-04-12 11:06:00

How do you create a debug only function that takes a variable argument list? Like printf()
我想使用与 例如:
我看过可变参数宏,但并非在所有平台上都可用。 我仍然通过定义宏(下面的XTRACE)将其与无操作或具有可变参数列表的函数相关联,以旧方式进行操作。在内部,调用vsnprintf,以便您可以保留printf语法:
然后是典型的#ifdef开关:
好了,可以清理很多,但这是基本思想。 这就是我在C ++中调试打印输出的方式。像这样定义" dout"(调试):
在代码中,我像使用" cout"一样使用" dout"。
如果预处理器将'dout'替换为'0 && cout',请注意<<具有比&&更高的优先级,并且&&的短路求值使整行的求值为0。由于未使用0,因此编译器根本不生成任何代码。对于那条线。 这是我在C / C ++中所做的事情。首先,您编写一个使用varargs内容的函数(请参见Stu文章中的链接)。然后执行以下操作:
您需要记住的是在调用调试函数时使用双括号,并且整个行将以非DEBUG代码删除。 可变参数函数的另一个有趣的方法是:
@CodingTheWheel: 您的方法存在一个小问题。考虑一个呼叫,例如
这在调试版本中工作正常,但在发行版本中它将扩展为:
这是完全合法的C语言,可以编译并且通常运行时没有副作用,但是会生成不必要的代码。我通常用来消除该问题的方法是: 使XTrace函数返回一个int(仅返回0,返回值无关紧要) 将#else子句中的#define更改为:
现在发行版本将扩展为:
而且任何合适的优化程序都将丢弃整个过程,因为短路评估会阻止&&之后的任何事情执行。 当然,就像我写的最后一句话一样,我意识到也许原始形式也可能被优化,并且在副作用的情况下,例如将函数调用作为参数传递给XTrace,这可能是一个更好的解决方案,因为它将确保调试和发行版本的行为相同。 在C ++中,您可以使用流运算符简化操作:
并像这样使用它:
然后,您可以按照与输出到 啊,vsprintf()是我所缺少的东西。我可以使用它来将变量参数列表直接传递给printf():
然后将整个内容包装在宏中。 看一下这个线程:
它应该回答您的问题。
这种功能的部分问题在于通常需要 下面是我编写的调试标头,它具有几个很酷的功能:
注意:由于某种原因,我有一些轻微的代码格式化问题。
它们在什么平台上不可用? stdarg是标准库的一部分: http://www.opengroup.org/onlinepubs/009695399/basedefs/stdarg.h.html 没有提供它的任何平台都不是标准的C实现(或者非常非常古老)。对于这些,您将必须使用varargs: http://opengroup.org/onlinepubs/007908775/xsh/varargs.h.html 这是用户答案的TCHAR版本,因此它将以ASCII(正常)或Unicode模式(或多或少)工作。
我说"或多或少",因为它不会自动将ASCII字符串参数转换为WCHAR,但它应该使您摆脱大多数Unicode刮痕,而不必担心将格式字符串包装在TEXT()中或在L之前加上它 。 很大程度上源于MSDN:检索上一个错误代码 这是我用的:
_DEBUG_LOG标志关闭时,在运行时绝对不会花费任何费用。 今天遇到了问题,我的解决方案是以下宏:
然后,您可以像下面这样调用函数:
|
最新内容
相关内容
python不定参数传值怎么做
python不定参数传值怎么做,位置,培训,名称,标准,代码,参数,函数,定义,教程,程序,使用*arg_name定义的位置参数,表示任意多个位置参数;Python标python如何定义函数
python如何定义函数,培训,概念,代码,环境,函数,定义,语句,括号,结果,冒号,函数的概念:函数是组织好的、具有一定功能的代码片段。在Python中,定pythonid函数如何运行
pythonid函数如何运行,培训,地址,代码,对象,函数,内存,类型,可能会,整数,字符串,id(object)功能:返回的是对象的“身份证号”,唯一且不变,但在不python函数嵌套时怎么调用
python函数嵌套时怎么调用,培训,函数,周期,变量,嵌套,作用,定义,里面,上层,也就是说,python允许创建嵌套函数。也就是说我们可以在函数里面定pythonmap函数怎么显示结果
pythonmap函数怎么显示结果,培训,代码,数字,函数,结果,序列,元素,参数,可能会,惰性,map()函数接收两个参数,一个是函数,一个是Iterable,map将传pythonstr函数怎么用
pythonstr函数怎么用,培训,函数,字符串,整数,参数,列表,示例,初始化,变量,字典,str函数是Python的内置函数,其语法格式为str(object)返回值:返python没有main函数吗
python没有main函数吗,入口,代码,培训,位置,方法,函数,文件,程序,都会,属性,相信很多初学python的人看代码的时候都会先找一下main()方法,从mapython如何安装第三方函数库
python如何安装第三方函数库,工具,在线,培训,情况,管理系统,名字,管理,命令,函数库,脚本,python安装第三方库有两种方式:1.使用pip命令行工具pythonstr函数怎么使用
pythonstr函数怎么使用,培训,字符串,函数,字典,列表,参数,整数,形式,类型,示例,str函数是Python的内置函数,它将参数转换成字符串类型,即人适合pythonpython是函数式语言吗
pythonpython是函数式语言吗,培训,代码,函数,概念,指数,状态,语言,变量,计算机,程度,函数是Python内建支持的一种封装,我们通过把大段代码拆成python函数与方法的区别是什么
python函数与方法的区别是什么,培训,函数,方法,区别,对象,以上,方式,更多,内容,python中函数和方法的区别1、函数要手动传self,方法不用传selpython定义函数不带括号吗
python定义函数不带括号吗,培训,代码,函数,名称,情况,括号,定义,圆括号,自变量,参数,python定义函数带不带括号:函数能提高应用的模块性,和代码