自动移除 Delphi IFDEF 编译指令

3

我目前正在处理一些“继承”的代码,其中散布着许多基于Delphi版本的条件编译指令,从Delphi 2开始。从现在开始,所有开发都将使用Delphi 2009或更高版本。在Delphi 2009中是否有一个工具或插件,可以自动删除基于指定“最低”版本的编译器条件代码段?

5个回答

6
我强烈推荐Delphi Inspiration Pascal Preprocessor (DIPP),它可以在除了删除条件定义之外的许多方面对源文件进行处理,包括“内联”包含文件和删除注释(当然,所有这些都可以通过向处理器提供的选项高度可配置和可控制)。
条件定义功能特别有用,因为您可以选择将所有这样的条件定义简单地删除或者提供一组您希望应用的DEFINE。然后,DIPP将发出一个反映编译器如何使用这些符号定义的源文件,但没有条件指令本身。
因此,在您的情况下,您只需要定义适合您的“基线”Delphi版本的符号即可。

看起来非常有用。干杯,Jolyon。 - HMcG

4

你应该尝试使用 JCL中的JEDI PreProcessor(Pascal PreProcessor)。

在我们的SVN中,源代码可以在 jcl / devtools / jpp目录中找到,在我们的最新版本(2.1)zip文件中,jpp.exe可以在devtools目录中找到。


1

我不知道有这样的工具,但编写它应该相对简单。

  1. 使用 FindFirstFindNext 循环遍历目录中的所有文件。
  2. 使用 TStringList.LoadFromFile 读取所有 pas 文件。
  3. 循环遍历字符串并查找 {$IfDef} 指令。如果条件部分中指定的版本早于 D2009,则删除所有文本直到 {$EndIf}
  4. 使用 TStringList.SaveToFile 将修改后的文件写入磁盘。

不要忘记这样做时也要注意{$ELSE}和{$ELSEIF}。 - Michael Madsen
同上,可以使用完整表达式的{$if defined(x)} - Marco van de Voort

1

我的建议是仅更改您完全管理的代码。但如果您也要修改现有的第三方代码,那么我建议您查看每个IFDEF定义以进行验证。一些供应商不使用标准的IFDEF VERxxx调用,而是创建自己的调用方式,可能被称为VER70UP或类似名称。这种情况最常见的地方是在包含文件中,因此请查找每个文件开头附近的{$I ???.INC}文件,然后分析其中使用的内容和方法。

分析每个$DEFINE/$UNDEF的另一个原因是特定版本可能会打开先前未检查的新定义...最终导致死代码。


0

使用GExperts,您可以使用GrepSearch或GrepRegularExpressions在代码中进行搜索,然后在GrepResults中使用Replace工具删除任何需要的内容。

您可以对列表中的所有匹配项执行搜索和替换操作,也可以仅对选定的文件/匹配项执行操作。选择其中一种选项时,会出现一个对话框提示要使用的字符串以替换匹配的文本。请注意,由于IDE的限制,当前打开的窗体无法替换其文本。在尝试替换其中的文本之前,请关闭所有窗体。


1
Grep实际上仅仅是一种编辑器技巧,它无法理解#ifndef条件语句(例如:$if defined(y) and defined(x) },即使使用这种语句,我也会选择一些不需要手动操作且可以多次重试的工具,比如SED。只有在完全没有其他选择时才使用类似于Grep这样的工具。 - Marco van de Voort

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接