为什么Ada编译让遭受侵犯过? 它确实给了警告,但它为什么让它通过,如果它是在任何情况下的错误? 是否有实际的场景,其中,这是一个有用的行为?
而最重要的是:为什么是类型声明运行时的实体? 我指的是代码示例的第三行是我预料的时间提前进行评估。 我以为只有5号线将“让”到可执行文件。 为什么不? 那是一些有用的东西? 我丢失或曲解这里的东西?
with Ada.Text_IO;
procedure question is
subtype Test is Natural range -1 .. 10;
begin
Ada.Text_IO.Put_Line ("foobar");
end;
注:结果是相同的“型式试验新的自然范围-1..10;”
注:GNAT 4.6
这comp.lang.ada消息表明,你至少需要-gnato -fstack-check
命令行选项蚋是一个符合ADA要求编译器。
然而,这不是这里的问题:编译器警告的范围内误差; 与蚋我得到:
gnatmake -gnato -fstack-check question
question.adb:3:35: warning: static value out of range of type "Standard.Natural"
question.adb:3:35: warning: "Constraint_Error" will be raised at run time
并在运行时明显的错误。
在这种情况下,因为范围是静态编译器就能赶上的错误; 但你都在猜测,一般类型不能运行,直到完全确定,如下面的例子。
with Ada.Text_IO;
with Ada.Command_Line;
procedure question is
subtype Arguments is Natural range 1 .. Ada.Command_Line.Argument_Count;
begin
for i in Arguments loop
Ada.Text_IO.Put_Line ("Argument " & integer'image(i) &
" is " & Ada.Command_Line.Argument(i));
declare
OneArg : constant String := Ada.Command_Line.Argument(i);
subtype Characters is Natural range OneArg'range;
begin
null; -- process the string here
end;
end loop;
end;
在这里,直到你运行的程序既不亚型是已知的。
declare代码段示出了相关图案我发现是非常有用的,其允许不仅变量[子]类型,但是使得它们自动回收和重新调整大小上每次循环迭代在栈上分配可变大小的物体。 (你可以用“新”,并免费提供“unchecked_deallocation”分配在其他语言,但很多时候,因为这里根本就没有必要)
文章来源: Why does an Ada compiler let range violations pass? Why is my type declaration a runtime entity?