当使用特定的RTL/VCL或Delphi语言元素时,我该如何生成警告?

3
我想标记某些元素、函数和类作为“已弃用”,以便编译器生成警告。
我的目的是现代化源代码的某些方面,特别是在更多的平台独立性方面。例如,通过将WinAPI和特殊的Windows类(如TRegistry)标记为“已弃用”,它们可以被替换或至少移动并使其具有平台独立性。至于语言元素,我尤其想淘汰withlabelgoto关键字。
我已经尝试通过在单元文件底部插入{$IF DECLARED(...)}{$MESSAGE WARN...}来生成函数和类的警告,但这显然会失败与核心单元一起使用......
有人知道一个能做到这点的工具吗?

据我所知,这是不可能的。您可以在声明代码时在自己的代码中使用“已弃用”关键字,但它对核心单元或代码结构(如“goto”)没有影响。Delphi已经在一定程度上警告特定于平台的代码;XE2使在更改平台时事情相对透明(尽可能地)。 - Ken White
2
寻找静态代码分析工具,我相信一定有一个带有你所需选项的工具。 - Disillusioned
据我所知,ToolsAPI是一组用于扩展和增强Delphi设计环境的类和函数,而不是Delphi编译器。只是提一下,有一个命令行编译器。在编译器级别使用插件系统可能很有趣,但它绝对不会成为ToolsAPI的一部分。或者您可能想使用FreePascal,并更改源代码以使编译器符合您的确切需求。 - Arnaud Bouchez
@ArnaudBouchez 我对ToolsAPI的细节不是很了解(但我会努力),但据我所知,您可以添加一个AfterCompile Notifier并访问IDE的MessagingServices。 - Tobias R
如果使用得当,with 没有任何问题。符号可以发出警告,但保留字不行。 - Premature Optimization
显示剩余2条评论
4个回答

2

你无法废弃像withgoto等关键字。如果想要现代化你的代码,只需查找这些单词并将其更改为整个单词。

对于Win.*核心单元中的标识符也是如此。你可以修改RTL并重新编译它,或者你可以从这里下载JEDI API头文件,并指定所有例程和类型为platform,或仅限于单元。我建议不要重新编译RTL。你可以自行决定如何处理来自JEDI的单元。

除了Win.*单元之外,大多数RTL实际上都是平台无关的,即使在64位或Mac上,withgoto也能正常工作。

我的建议:寻找更好的方式来现代化你的代码,不要试图废弃RTL所提供的功能。


实际上,自从提示指令引入以来,这一点一直困扰着我 - 为什么Windows单元从未被标记为platform,而它明显是特定于平台的,因为其中引入的所有符号都是如此。我知道旧的单元别名机制用于跨平台编译,但是,这种情况仍然不合适。/抱怨 - Premature Optimization

1

首先,我不建议您按照您想要的方式进行操作,因为其他人已经提到了所有原因。但是,如果您觉得必须这样做,那么这里有一种方法可以实现您所要求的部分功能。

您可以在项目中为特定于平台的代码打开警告。至于其他您认为已被Delphi弃用但实际上并未被弃用的内容,我有一个需要一些工作的解决方案。

创建一个重新声明您想要弃用的类的单元,如下所示:

unit PleaseDeprecateThisStuff;

uses
  Registry;

interface

type
  TRegistry = class (Registry.TRegistry)
  end deprecated;

implementation

end;

编辑2:我觉得我应该进一步解释一下源码。对于每个类,比如TRegistry的例子,你需要在这个单元中包含一个同名版本,并使其与另一个单元中的版本完全相同。确保将该单元包含在此单元的使用子句中(duh),并在类型部分中添加类引用前缀,例如Registry.TRegistry的示例。

包括您想要弃用的所有内容,然后在每个您想要“保护”的单元的接口uses子句的末尾包含此单元。

编辑:这个技巧只能帮助处理类、变量和常量...不能处理保留字。

再次声明,这是一个可怕的想法。:p


我不认为我在尝试做什么可怕的事情,但还是谢谢你的建议。我尝试过了,但对于更大的项目来说并不可行。 - Tobias R
抱歉,我之前说“可怕”这个词是因为那只是一个权宜之计,而且需要相当多的工作才能完成你所要求的任务。 - Jerry Gagnon

1

无论你多么讨厌它们,也不能在核心语言特性(如withlabelgoto)上放置警告。

这些是保留字应该已经提示了你这一点。

这些特性不属于任何单元,它们是 Pascal 语言的一个特性(自其开始以来就一直存在),并深入编译器中。

你甚至不能重新定义它们,因为它们是保留字。


1
作为警告的替代,您可以使用一个简单的应用程序来解析所有源代码并报告这些结构的使用情况。
通过一些调查,我相信您可以找到一些静态代码分析工具,甚至可以进一步警告您某些代码异味(例如:try..finally的不正确使用,异常被吞噬)。
将该应用程序或静态代码分析器作为构建过程中的一步插入,那么您就有了类似于编译时警告的功能。

有趣。有人知道我是否可以在IDE中定义自定义审核吗? - Tobias R
这似乎是目前最快的解决方案。当然,RTL非常平台无关(至少我希望如此,我还没有完全测试过),但我认为每个开发人员偶尔都会皱起眉头,因为RTL在这里或那里有一些小错误,或者可能与当前的操作系统开发不符。这将有望在未来改变,但在那之前,我会保留几个解决方法和修复方法。 - Tobias R

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