2013-05-05 15 views
9

Tôi đến từ C/C++ trên hệ thống nhúng và tất cả thời gian bên trong một hàm chúng tôi sử dụng biến tĩnh để giá trị được giữ lại trong suốt cuộc gọi.Ada tương đương với biến tĩnh cục bộ từ C/C++

Trong Ada, có vẻ như điều này chỉ được thực hiện với tương đương với các biến tĩnh cấp tệp. Có một Ada tương đương.

C++:

function Get_HW_Counter() { 
    static int count = 0; 
    return ++count; 
} 

Ada: ??

Trả lời

10

Biến cấp gói.

Lưu ý rằng các gói không nhất thiết phải ở cấp tệp; bạn thậm chí có thể tạo và sử dụng một gói địa phương cho một chương trình con nếu bạn muốn. Một sử dụng của một gói là tạo một đối tượng và tất cả các phương thức hoạt động trên nó (mẫu đơn); giữ tất cả các chi tiết của đối tượng riêng tư.

Nếu sự hiểu biết của tôi về C++ không phải là quá rỉ sét, tương đương gần sẽ là:

package HW_Counter is 
    function Get_Next; 
private 
    count : natural := 0; -- one way of initialising 
    -- or integer, allowing -ve counts for compatibility with C++ 
end HW_Counter; 

và đó là tất cả khách hàng của gói cần để xem.

package body HW_Counter is 

    function Get_Next return natural is 
    begin 
     count := count + 1; 
     return count; 
    end Get_Next; 

begin -- alternative package initialisation part 
    count := 0; 
end HW_Counter; 

Và việc sử dụng thường sẽ là

C := HW_Counter.get_next; 
+0

Bạn có thể tạo một gói địa phương để một chương trình con, nhưng nó sẽ được xây dựng trên mỗi mục (vì vậy bất kỳ biến sẽ được reinitialised). –

+0

Thực ra, khi đọc lại câu hỏi, tôi nghĩ đây chính xác là tương đương với các biến tĩnh cấp tệp. Vì vậy, không, tôi không tin rằng có một Ada tương đương với C. Nhưng nó không khó để có được hiệu ứng tương tự, nếu một chút mệt mỏi hơn. –

+0

Trong Ada 2012 bạn thậm chí không cần một gói phần mềm cơ thể bạn có thể sử dụng một biểu thức chức năng trong phần tư nhân để thực hiện các accessor. – Shark8