【问题标题】:How to understand a large C/C++ code that is full of macros? [duplicate]如何理解充满宏的大型 C/C++ 代码? [复制]
【发布时间】:2012-01-21 13:16:06
【问题描述】:

可能重复:
C/C++ source file after preprocessing

前几天,我被分配一个任务来修复在 VC++ 8 下开发的大型 C/C++ 项目中的一个错误。问题是这段代码真的充满了嵌套宏。 理解这段代码的最佳方式是什么?任何建议表示赞赏。

【问题讨论】:

  • 这不属于程序员吗?
  • 这不是链接问题的完全欺骗。
  • 我的 Q 不是 SO 上提到的 Q 的完全副本。我的 Q 可以通过查看提到的 Q 来回答,但这不会是最后一个答案。
  • 引用问题的答案与这个问题几乎无关

标签: c++ c visual-c++ macros


【解决方案1】:

我认为你首先需要了解宏的作用,然后尝试了解宏展开后代码的作用。希望每个宏或一小组宏都有某种意义,您可以从定义和/或 cmets 中找出答案。

虽然您可以通过预处理器运行代码,但这通常会给您一个相当未分化的质量(没有 cmets),这可能更难理解。

【讨论】:

  • Visual Studio 可以选择在预处理代码中保留 cmets 和/或行号
  • @Duck:即使有这些选项,宏仍然被混合成一行,并且删除了一些 cmets。
【解决方案2】:

通过使用编译器行选项/E,构建会将所有预处理器输出输出到标准输出。该文件将包括所有扩展的宏以及所有扩展的内联包含。您需要根据构建项目的方式找出添加此标志的最佳方法。通过输出,您可以更好地查看宏也在扩展什么,但是将输出追溯到哪个宏扩展它仍然很棘手。但是,您应该能够弄清楚这一点。 Reference for the command line options for VS8.0 compiler.

正如 cmets 中所指出的,这是重复的,这是更好的答案:https://stackoverflow.com/a/277362/192896

【讨论】:

  • 除非预处理器被用来故意混淆代码,否则我发现预处理器后的代码比原始代码更难理解。这取决于宏的组织和理解程度。
  • @ChrisDodd:同意。你是完全正确的。使用上述技术会使代码更加复杂。
  • 在我看来,使用许多宏会使代码更复杂,因为它们执行的操作比一个或两个语句更复杂。不幸的是,有很多来源过度使用宏,有时调试它们的唯一方法是使用预处理器输出。
猜你喜欢
  • 2015-01-15
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多