【问题标题】:Commenting printf() statements in code在代码中注释 printf() 语句
【发布时间】:2013-10-21 06:30:57
【问题描述】:

最近,在处理大量代码时,我观察到有时添加一些额外的 printf() 语句并对其进行注释对于必须修改代码的后期调试(使其更容易)非常有用。但是对于过度注释代码和缺乏适当的 cmets 存在争议。我不确定这种做法在哪里?此外,我发现这种注释方式的一个缺点是它使代码看起来更难看。这是一个例子:

 ...... //代码
 ……
 pkt_bytes_decd = avcodec_decode_audio4(aCodecContext, pFrame,
                                         &frame_fin, &packet );
//printf("解码数据包中的 %d 个字节\n",pkt_bytes_decd); …… ...... //代码
这是一种不好的做法吗?有人可以从他们的经验中讨论利弊吗?

【问题讨论】:

  • 以后在上面的代码中添加代码的时候,如果新添加的代码有bug,可以取消上面的printf()语句的注释,看看问题出在哪里。这种做法对我很有帮助。
  • 你没有调试器?
  • 我期待这个问题。我使用 Kdbg 作为前端(使用 gdb 作为后端)。但是对于多线程程序,它没有按预期工作。我尝试使用 Helgrind(与 valkyrie),但没有成功。我发现这种调试方法(在某些情况下)比使用有缺陷的调试器更容易。
  • 是的,没有灵丹妙药,在某些情况下我也使用日志语句,但尝试将其作为更永久的代码。例如可以关闭的日志记录语句(不管发布/调试)
  • 感谢您的积极建议。你能详细说明一下声明吗?我不是很明白。

标签: c coding-style comments


【解决方案1】:

使用一些依赖于启用或禁用调试标志的宏会更简洁。

这样,您无需取消注释即可进行调试。只需启用调试标志,它就会立即在所有此类位置启用日志记录。

有时会使用另一种方法 - 调用 log(level, message) 之类的函数,并且仅当级别高于设置阈值时才会发出消息(通常称为错误、警告、信息等)。它效率不高,但使调试更容易。

【讨论】:

  • 感谢您的信息。你能举出这两种情况的小例子吗?
  • 第一个例子,见Android ALOGV_IF - 如果LOG_NDEBUG 存在,它将被编译出来。第二个例子,见Android ALOGW
【解决方案2】:

如果您想在最终代码中包含调试语句,请使用命令行选项设置全局,然后为每个 printf 检查该全局:

if(DEBUG) printf("extra info");

如果您想要调试语句,但不是最终代码,请使用预处理器:

$ gcc -DDEBUG <files>

#ifdef DEBUG
printf("extra info");
#endif

【讨论】:

  • 谢谢。这看起来很简单。但是无论哪里有记录所需的 printf() 语句,我都必须再添加 2 行代码。此外,它使代码看起来更难看。你怎么看?
  • 根据您的开发环境,我可能会使用this 之类的工具来简化调试行的键入。我个人也不认为它很难阅读,但这更多的是个人问题。我自己发现这种方法值得付出额外的努力,但我更像是一个业余爱好者而不是专业人士,所以我可以'不是说这是行业标准或其他任何东西,但对我来说效果很好。
  • 注意点 :) 谢谢。
【解决方案3】:

您需要区分用于在客户站点进行故障排除的永久记录信息和仅在开发时记录信息。我发现后者大部分可以通过使用调试器和普通的// "why-comments" 来替换。如果由于某种原因使用调试器太麻烦,那么我个人认为最好有一个不受发布或调试模式影响的日志记录机制。

在开发时使用两个不同版本的程序始终存在风险,即发布版本和调试版本。如果版本差异太大,您以后可能会得到一些令人讨厌的惊喜。事实上,它们就像两个不同的程序。

例如,调试语句通常会使程序运行速度变慢,因此如果您的代码中有一些计时问题(例如竞争条件),它们可能会被隐藏,但当您以发布模式(或更多)运行程序时,它们当然会突然弹出可能在您向客户/用户展示程序时)。

为什么-评论

++sp; // 将堆栈指针移动到最后一个元素之外以标记下溢

什么评论

++sp; // 递增 sp

【讨论】:

    【解决方案4】:

    编译器不保留 cmets。所以在 cmets 中写 printf 是可以的。 不是一个坏习惯。但过度使用是不好的。 关键是:- “平衡”

    优点:- 1) 调试快速检查变得非常容易。

    缺点:- 1)评论本身可能比代码更令人困惑。 2)在调试时,程序员可能会高度依赖cmets,从而忽略代码流。 3) 写代码时评论是多任务。这会减慢编码速度。:-(

    【讨论】:

      猜你喜欢
      • 2015-12-15
      • 1970-01-01
      • 2012-10-20
      • 2011-03-20
      • 2023-03-09
      • 2014-03-10
      • 2023-04-02
      • 1970-01-01
      • 2012-01-05
      相关资源
      最近更新 更多