How to get a message from compiler when incorrect string format is used

use*_*813 4 delphi string formatting

Here is a piece of Delphi code that the compiler perfectly compiles :

Var S: String;

Begin
 S := Format('%s  %s', ['Hello']);
....
Run Code Online (Sandbox Code Playgroud)

But on execution it raises an exception, of course there are two argument in the left string, and only one in the brackets...

Is there a way to have this error checked by the compiler and to be displayed at least as a warning, or better fatal error?

Ken*_*ite 6

目前编写的编译器不费力气就知道第一个参数中的引号之间嵌入了什么。它还不计算第二个参数中传递的值,也不知道它们是否正确。在调用函数之前,不会对它们进行求值,因为它们不正确,因此会引发异常。IOW,编译器不会尝试执行任何允许其发出此类警告或错误的操作。

在运行时调用该函数时,它将验证参数的数量,它们是否是正确的类型以及是否提供了正确的参数。编译器不会尝试以任何方式执行此操作。它仅确保为第一个参数提供一个字符串,为第二个参数提供一个const数组。

因此,要直接回答您所问的问题:不,没有办法让编译器检查该错误以发出警告,因为编译器不努力检查允许它执行的任何操作。

  • “ * IOW,该信息在编译时不可用,以便编译器向您提供该消息*”-很好,该信息*可用*,但是编译器只是忽略了它。现代C ++编译器能够在编译时验证printf / scanf样式参数(即通过gcc / clang中的__attribute __((__ format__(...))))。Delphi编译器可以进行更新以识别Format()以进行特殊处理(可能使用编译时属性对其进行标记),并分析第一参数中的字符串以将其与第二参数中的数组值进行比较。他们只是还没有实现 (2认同)
  • @KenWhite我知道* current *编译器无法实现这一点。我只是说,如果有人要向QualityPortal提交功能请求并且获得足够的投票,那么*未来*编译器*可以*支持它。 (2认同)
  • @RemyLebeau:编辑过的帖子。删除了似乎困扰您的评论。我非常怀疑是否有足够的人会赞成这样的建议,使其优先于编译器应解决的许多其他问题。 (2认同)
  • 如果为格式字符串传递了变量,或者参数的一部分是变量,则编译器将无法解析。在这种情况下,我宁愿不进行任何解析, (2认同)
  • 我同意`Format`经常与`resourcestring`s一起使用。实际上,我的绝大多数Format都是以resourcestring作为第一个参数调用的。尽管如此,即使在这种情况下,编译器仍可以(理论上)验证源代码中赋予“ resourcestring”的值是否与参数列表匹配。然后,我的翻译工具可能会警告我有关不同语言之间的不一致之处。 (2认同)