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.
Nguồn
2011-12-02 08:12:13
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". –