跳转到内容

Ada 编程/属性/'限制集

来自维基教科书,开放的书籍,开放的世界

此属性允许对当前生效的限制进行编译时测试。它主要用于根据生效的限制(例如,如果已知限制 No_Floating_Point 生效,则无需保存 fpt 寄存器)在运行时对代码进行专门化,但可用于任何地方。

有两种形式

System'Restriction_Set (partition_boolean_restriction_NAME)
System'Restriction_Set (No_Dependence => library_unit_NAME);

在第一种形式的情况下,唯一允许的限制名称是无参数限制,这些限制在绑定时进行一致性检查。有关完整列表,请参阅子类型 System.Rident.Partition_Boolean_Restrictions

如果已知限制生效,则返回的结果为 True;如果已知限制不生效,则返回的结果为 False。一项重要的保证是,限制集属性的值在整个分区的所有代码中都保持一致。

如果整个分区使用一致的限制编译指令集进行编译,那么这一点很容易实现。但是,编译模型并不需要这样做。可以对一组单元使用一组编译指令集进行编译,而对另一组单元使用另一组编译指令集进行编译。甚至可以用一组编译指令集编译规范,然后使用不同的编译指令集对同一规范进行 WITH 操作。在绑定时检查实际使用限制方面的一致性。

为了实现对限制集编译指令的一致性保证,我们认为产生 False 的编译指令使用等同于违反限制。

例如,如果你写

if System'Restriction_Set (No_Floating_Point) then
   ...
else
   ...
end if;

结果为 False,因此执行 else 分支,你可以假设该限制未为分区中的任何单元设置。通过将此限制编译指令的用法视为违反限制 No_Floating_Point 来检查这一点。这意味着没有其他单元可以尝试设置此限制(如果某个单元尝试设置它,绑定器将拒绝绑定分区)。

技术说明:限制名称和单元名称完全通过语法进行解释,就像在相应的限制编译指令中一样,它们不会语义分析,因此它们没有类型。

华夏公益教科书