为什么一个Ada编译让遭受侵犯过? 为什么是我喜欢的类型声明运行时的实体?(Why does a

2019-07-18 17:04发布

为什么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

Answer 1:

这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?