|
|
1
24
我仍然采用旧的方法,通过定义一个宏(下面的XTRACE),该宏与无操作或带有变量参数列表的函数调用相关联。在内部,调用vsnprintf以便保留printf语法:
然后是一个典型的#ifdef开关:
嗯,这可以清理很多,但这是基本的想法。 |
|
|
2
22
这就是我在C++中调试打印输出的方法。定义“dout”(调试输出)如下:
在代码中,我使用“dout”就像“cout”一样。
如果预处理器将“dout”替换为“0&&不能注意到<<优先级高于&&以及短路评估;&使整条线的计算结果为0。由于没有使用0,编译器根本不会为该行生成代码。 |
|
|
3
11
这是我用C/C++做的一些事情。首先,您编写一个使用varargs内容的函数(请参阅Stu帖子中的链接)。然后做这样的事情:
您只需在调用调试函数时使用双括号,整行代码将在非调试代码中被删除。 |
|
|
4
4
啊,vsprintf()是我缺少的东西。我可以用它将变量参数列表直接传递给printf():
然后把整个东西包在一个宏中。 |
|
5
4
另一种删除可变函数的有趣方法是:
|
|
|
6
3
@对车轮进行编码: 你的方法有一个小问题。考虑一个电话,例如
这在调试版本中运行良好,但在发布版本中,它将扩展为:
这是完全合法的C语言,编译和运行通常没有副作用,但会生成不必要的代码。我通常用来解决这个问题的方法是:
现在发布版本将扩展到:
任何一个像样的优化器都会扔掉整个东西,因为短路评估会阻止在&&永远不会被处决。 当然,就在我写最后一句话的时候,我意识到也许原始形式也可能被优化掉,在出现副作用的情况下,比如作为参数传递给XTrace的函数调用,这可能是一个更好的解决方案,因为它将确保调试和发布版本的行为相同。 |
|
|
7
2
在C++中,你可以使用流运算符来简化事情:
并像这样使用它:
然后,您可以为类实现定制的跟踪输出,就像输出到
|
|
|
8
1
它们在哪些平台上不可用?stdarg是标准库的一部分: http://www.opengroup.org/onlinepubs/009695399/basedefs/stdarg.h.html 任何不提供它的平台都不是标准的C实现(或者非常非常古老)。对于这些,你必须使用varargs: http://opengroup.org/onlinepubs/007908775/xsh/varargs.h.html |
|
9
1
这种功能的部分问题在于,它通常需要 可变宏。这些是最近才标准化的(C99) 旧的C编译器不支持该标准,或者有自己的特殊工作 周围。 下面是我写的一个调试头,它有几个很酷的功能:
注意:由于某种原因,我遇到了一些轻微的代码格式问题。
|
|
|
10
1
|
|
|
11
0
这是我使用的:
当_DEBUG_LOG标志关闭时,这在运行时绝对不花费任何成本。 |
|
|
12
0
这是用户答案的TCHAR版本,因此它将作为ASCII码工作( 正常的 ),或Unicode模式(或多或少)。
我说“或多或少”,因为它不会自动将ASCII字符串参数转换为WCHAR,但它应该能让你摆脱大多数Unicode抓取,而不必担心将格式字符串包装在TEXT()中或前面加L。 |
|
|
13
0
问题中问的不完全是什么。但这段代码将有助于调试,它将打印每个变量的值及其名称。这是完全独立于类型的,支持可变数量的参数。 甚至可以很好地显示STL的值,前提是您为它们重载了输出运算符
样品使用:
输出:
|
|
|
14
0
今天遇到了这个问题,我的解决方案是以下宏观:
然后,您可以这样调用该函数:
|
|
AstralHex · 矩阵乘法代码工作不正常 1 年前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |