跳轉到內容

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 來檢查這一點。這意味著沒有其他單元可以嘗試設定此限制(如果某個單元嘗試設定它,繫結器將拒絕繫結分割槽)。

技術說明:限制名稱和單元名稱完全透過語法進行解釋,就像在相應的限制編譯指令中一樣,它們不會語義分析,因此它們沒有型別。

華夏公益教科書