Compilation 在对象Pascal中,如何在Delphi编译器和FPC中找到字符是字母数字还是下划线?

Compilation 在对象Pascal中,如何在Delphi编译器和FPC中找到字符是字母数字还是下划线?,compilation,freepascal,alphanumeric,delphi,Compilation,Freepascal,Alphanumeric,Delphi,互联网上到处都有类似或相同的问题,但答案对我来说并不适用。我们开发了多平台产品,它是在Delphi的编译器和FPC下编译的。 首先,我使用: Uses: System.Character; Uses: Character; 及 ,但无法在FPC下编译,因此根据其他来源,我使用: Uses: System.Character; Uses: Character; 及 相反,但仍然不能在FPC下编译 有人能找到一种方法使代码在Delphi编译器和FPC上都能工作吗?我没有为我的

互联网上到处都有类似或相同的问题,但答案对我来说并不适用。我们开发了多平台产品,它是在Delphi的编译器和FPC下编译的。 首先,我使用:

Uses:
  System.Character;
Uses:
  Character;

,但无法在FPC下编译,因此根据其他来源,我使用:

Uses:
  System.Character;
Uses:
  Character;

相反,但仍然不能在FPC下编译

有人能找到一种方法使代码在Delphi编译器和FPC上都能工作吗?我没有为我的项目设置FPC,所以我无法自己解决如何修复FPC中的代码(我只能通过build server以复杂的方式进行测试),也找不到方法,也找不到方法


我还想用regex编写它,但同事们说,这对他们来说太复杂了

Delphi和FPC都包含一个名为
TCharacter
的类,该类公开了一个名为
IsleterOrdigit
的方法。换句话说,你问题的前提是错误的。使用
TCharacter.isleterOrdigit
是完全合理的

文档链接:

  • 德尔菲:
  • FPC:

完全有可能您使用的是过时的FPC版本,这可以解释代码失败的原因。虽然这是猜测,因为您没有包含错误消息的任何细节。

我会在单独的单元中创建自己的函数,并使用
{$IFDEF FPC}
在Delphi和FPC实现之间进行分支。是的,我会使用类似if的东西(在['0''9','a''z','a''z','u']),但同事们说,必须有一些功能可以更灵活地完成它(并且可以在更多地方重用)。顺便说一句,我只关心ASCII。我不想创建一个新函数,因为我真的认为它已经编写好了。你不明白维多利亚说了什么。你的新函数不能完成繁重的工作。它只是有条件地调用Delphi和FPC的库方法。在这样做时,它提供了一个独立于平台的接口。啊哈,sry,好吧,我也可以在新函数之外有条件地这样做,但我不知道如何正确地从FPC调用,因为编译总是失败。无论如何,你根本不需要有条件地这样做。您可以在这两种语言中都使用
TCharacter.isleterOrdigit
。现在有一些严厉的建议。不要在没有给出错误细节的情况下询问错误。“无法编译”对任何人都没有帮助。也许您不阅读错误消息,但我们阅读。如果你不这样做,你需要马上学习如何阅读它们。我意识到,我们的构建服务器有一些奇怪的配置,我用不同的方式来做,比如在['0'..'9','a'..'z','a'..'z','u'],因为我的同事无论如何都不想使用TCharacter,这是一种较小的邪恶。谢谢。在Delphi中,['0'..'9','a'..'z','a'..'z','u']表达式在Delphi中无法正常工作,因为在Delphi中,Char映射到WideChar,并且集合只能包含0..255个值,因此没有WideChar。使用
TCharacter
,无论您的同事出于某种未知原因不想使用它。FWIW,
TCharacter。。。不推荐使用“使用TCharHelper”在XE7帮助中,没有提前检查。@TomBrunberg:它可能不推荐使用,但仍然有效,TCharHelper可能在FPC中不起作用。@RudyVelthuis最后,我使用了“CharInSet(,['0'..'9','a'..'z','a'..'z','U']),它运行良好,没有警告/提示。