自动删除 Delphi IFDEf 编译器指令

Posted

技术标签:

【中文标题】自动删除 Delphi IFDEf 编译器指令【英文标题】:Removing Delphi IFDEf compiler directives automatically 【发布时间】:2010-01-09 11:52:12 【问题描述】:

我目前正在使用“继承”代码,该代码具有(随机散布在各处)一大堆基于 Delphi 版本的条件编译器指令,可以追溯到 Delphi 2 。从现在开始,所有的开发都将使用 Delphi 2009 或未来。 Delphi 2009 中是否有工具或插件可以根据指定的“最低”版本自动删除编译器条件代码段?

【问题讨论】:

【参考方案1】:

我强烈推荐Delphi Inspiration Pascal Preprocessor (DIPP)

除了删除条件定义之外,这还可以对源文件执行许多操作,包括包含文件的“内联”和删除 cmets(当然,所有这些都是高度可配置的,并且可通过提供给处理器的选项进行控制)。

条件定义功能特别有用,因为您既可以简单地删除所有此类条件,也可以提供一组您希望应用的 DEFINE。然后,DIPP 将发出一个源文件,该文件反映了编译器对这些符号的定义,但没有条件指令本身。

因此,在您的情况下,您只需定义适合您的“基线”Delphi 版本的符号。

【讨论】:

看起来很有用。干杯 Jolyon【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

如果你这样做,别忘了留意 $ELSE 和 $ELSEIF。 同上 $if defined(x) 可以制作完整的表达式【参考方案4】:

我的建议是只更改您完全管理的代码。但是,如果您还打算修改现有的第 3 方代码,那么我建议您检查为验证而定义的每个 IFDEF。一些供应商不使用标准的 IFDEF VERxxx 调用,而是创建自己的调用,可能称为 VER70UP 等。最常见的地方是包含文件,因此在每个文件的开头附近寻找一个 $I ???.INC 文件,然后分析它正在使用什么以及如何使用。

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

【讨论】:

【参考方案5】:

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

您可以进行搜索和替换 对所有匹配的操作 列表或仅选定的文件/匹配。 当您选择其中一个选项时, 出现一个对话框,提示您输入 用来代替匹配的字符串 文本。请注意,这些表格是 目前打开不能有他们的文字 更换,由于限制 IDE。请先关闭所有表格 试图替换其中的文本。

【讨论】:

Grep 不能真的更像是一种编辑技巧。它不理解 ifndef 条件(如果你有 $if defined(y) 和 defined(x) (即使那样我也会使用非手动的东西,我可以重试几次,比如 SED)。只使用东西像这样当完全没有其他选择时

以上是关于自动删除 Delphi IFDEf 编译器指令的主要内容,如果未能解决你的问题,请参考以下文章

C/C++预处理指令#define,条件编译#ifdefine

C++中#if #ifdef 的作用

linux学习之操作系统与程序

[转]Delphi预编译指令总结

条件编译#ifdef的妙用详解

#ifdef MINGW32 然后...不要编译这个