2011-12-02 29 views
12

Biến toàn cầu được khởi tạo theo thứ tự xuất hiện trong mô-đun dịch và thứ tự tương đối của việc khởi tạo biến trong các mô-đun dịch khác nhau trong không xác định (cái gọi là "dấu nháy đơn khởi tạo tĩnh").Không gian tên có ảnh hưởng đến thứ tự khởi tạo trong C++ không?

Không gian tên có ảnh hưởng gì đến điều đó không? Ví dụ nếu tôi có mã này:

//first.cpp 
int first; 
int second; 

nó sẽ có bất kỳ sự khác biệt trong thứ tự khởi so với mã này:

//second.cpp 
namespace { 
int first; 
} 
int second; 

Có trường hợp đặt một đối tượng toàn cầu vào một không gian tên ảnh hưởng đến trật tự khởi?

+1

Hãy nhận biết tiêu chuẩn C++ xác định rằng tên chung chỉ là những tên xuất hiện trong phạm vi toàn cục ([basic.scope.namespace]/3). Vì vậy, như xa như C + + là có liên quan, trong second.cpp 'first' không phải là một toàn cầu. Rõ ràng cho tất cả các mục đích thực tế để làm với "globals" và đặc biệt là "globals" có thể thay đổi được PITA để làm việc với, trong tất cả các ngôn ngữ lập trình, đó là một "toàn cầu". –

Trả lời

11

3.6 Các biến không phải cục bộ khác với thời gian lưu trữ tĩnh đã khởi tạo theo thứ tự. Biến số với việc khởi tạo sắp xếp được xác định trong một đơn vị dịch sẽ được khởi tạo theo thứ tự của các mệnh đề trong đơn vị dịch.

Không gian tên không ảnh hưởng đến điều này - không được đề cập trong phần này.

Điều gì ảnh hưởng đến đơn đặt hàng là các đơn vị dịch thuật khác nhau. Nếu bạn cần xác định thứ tự trên chúng, hãy sử dụng phần mở rộng như thuộc tính constructor của GCC.

+0

Thay vì sử dụng các tiện ích mở rộng để kiểm soát thứ tự, tôi khuyên bạn nên tránh hoàn toàn phụ thuộc. –

+0

@ DavidRodríguez-dribeas Thậm chí tốt hơn, tránh lưu trữ tĩnh. – Pubby

5

Vâng, "Biến toàn cầu được khởi tạo theo thứ tự xuất hiện trong mô-đun dịch" là xác định. Nó không để lại bất kỳ chỗ nào cho bất cứ điều gì khác, như không gian tên, để ảnh hưởng đến thứ tự.

Thực tế, "Biến toàn cầu được khởi tạo theo thứ tự ..." là báo giá không chính xác của tiêu chuẩn là chính thức sai. Các từ ngữ chính xác từ C++ chuẩn, tiêu chuẩn ISO/IEC 14882: 2003, 3.6.2 khoản 1 là:

Đối tượng với thời gian lưu trữ tĩnh được định nghĩa trong phạm vi không gian tên trong cùng một đơn vị dịch thuật và tự động khởi tạo sẽ được khởi tạo trong thứ tự mà định nghĩa của chúng xuất hiện trong đơn vị dịch thuật.

Vì vậy, thay vì "toàn cục", "tất cả các biến không phải cục bộ cho dù chúng là toàn cầu, thành viên không gian tên hoặc thành viên lớp học và liệu chúng có được khai báo là static hay không.

Ngoài ra, nó còn thêm "và được khởi tạo động". Các biến với các hàm tạo tầm thường và bộ khởi tạo không đổi luôn được khởi tạo đầu tiên (đơn giản bằng cách tải các giá trị của chúng từ nhị phân) và hơn tất cả các khởi tạo không liên tục được đánh giá và các nhà xây dựng không tầm thường được chạy theo thứ tự đó. Điều này là quan trọng, vì vậy bạn có thể ví dụ một cách đáng tin cậy tạo ra một danh sách liên kết trong các nhà xây dựng đó; nếu đầu của nó là con trỏ đơn giản, nó đã được khởi tạo, vì vậy bạn có thể làm việc với nó một cách an toàn.

+0

+1 cho nhấn mạnh: 'các biến toàn cầu được khởi tạo theo thứ tự xuất hiện trong mô-đun dịch" là xác định'. Kết thúc câu chuyện! – Nawaz

+0

Câu "xác định" như được nêu chỉ.nội dung trong không gian tên do người dùng xác định không phải là toàn cầu –

+0

@ JohannesSchaub-litb: Có, chúng là toàn cầu. Bạn đang buộc tôi phải tìm kiếm từ ngữ chính xác trong đặc tả. Ok, ở đây có ... (xem chỉnh sửa). –

Các vấn đề liên quan