【问题标题】:Preprocessor-aware code navigation in IDE for C projectIDE 中用于 C 项目的预处理器感知代码导航
【发布时间】:2016-12-02 18:23:15
【问题描述】:

背景

我花费大量时间浏览和编辑复杂的科学 C 代码。通常它们包含数百个使用预处理器指令打开和关闭的可选功能。这使得几乎不可能一眼看出当前代码块是否在我当前的设置中被激活。代码本身无济于事,因为每个功能都被弄脏了,而且所有事情通常都是使用全局变量完成的。

问题

是否有可以通过折叠/着色非活动代码来处理预处理器指令的 IDE?

我想人们可以使用已用标志的配置来维护一个项目,并且可以不受非活动逻辑分支的干扰。

【问题讨论】:

  • 我认为寻求建议是题外话。但是,您在哪个平台上? Visual Studio 会将 ifdef 中未使用的块灰显。
  • 我不确定它是否可以从 makefile 中提取它们,但我认为您可以在运行选项中设置一些定义,如果有任何用处,它将使用这些定义来突出显示
  • @AndriiMagalich 就我个人而言,我经常添加errorerror; 行或类似的东西来引发编译错误。如果没有编译错误,则代码未激活。
  • @sashoalm 有一个预处理器指令就是针对这种情况的。 #error 将导致预处理器失败,并打印一条可选消息。所以你可以有一些指令来检测无效的特征组合,然后失败。例如:#if defined(ACCEL_OPENCL) && defined(ACCEL_CUDA) #error Cannot build with both OpenCL and CUDA acceleration enabled #endif.
  • @gavinb 我知道它并亲自使用它而不是我建议的方式,但我不想混淆 OP,以防他不知道并不得不解释。

标签: c ide c-preprocessor


【解决方案1】:

看看similar question,Eclipse CDT 似乎完全具备您需要的功能,而the other question 实际上告诉您可以在哪里设置 ifdef。

Emacs has something similar hide-ifdef-mode 的形式。

但您也可以尝试使用与 IDE 无关的解决方案,例如通过 unifdef 运行代码并处理结果。如果您只需要阅读代码,这几乎是完美的解决方案。如果您需要进行一些更改,事情会变得有点复杂,但是您可以使用 git then 来管理更改,例如:

  • 将整个代码库导入 git
  • 跑通unifdef
  • 提交结果,这是补丁的基础
  • 在您喜欢的任何 IDE/编辑器中使用代码库,照常提交更改
  • 如果需要为原始代码库生成补丁,只需检查原始导入提交并从您的分支中挑选(或变基)您的补丁(当然有可能发生冲突,但应该相当很容易解决,因为您知道补丁中代码的预期更改,您只需要针对 ifdefs 进行调整)
  • 如果需要更新代码库,只需从原始导入开始,应用更新,提交,运行 unifdef,提交,然后在此基础上重新调整您的更改

当然,这种方法是否有效取决于特定的代码库以及您将要使用它做什么,但在某些情况下它可能很有用。

【讨论】:

    【解决方案2】:

    我使用 Vim 和几个插件作为我选择的 IDE(谢谢Steve Francia)。这很可能不是你的一杯茶,但如果是的话,我找到了一些建议来完成这个。

    Autofold #ifdef..#endif in Vim via .vimrc

    C Preprocessor Fold in Vim

    【讨论】:

      【解决方案3】:

      我在任何 IDE 中都没有听说过这个功能。但你仍然可以使用 经过预处理的代码可以使用。 Can gcc output C code after preprocessing?

      【讨论】:

      • 感谢您的建议,这可能有助于调试,但这不是一种开发方式
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多