2010-11-02 32 views
6

C++ 0x draftTại sao các tổ chức ẩn danh toàn cầu được yêu cầu phải được khai báo là tĩnh?

9.5.6 đoàn Anonymous tuyên bố trong một namespace tên hoặc trong không gian tên toàn cầu sẽ được khai báo tĩnh.

Tại sao?


Update-

Dựa trên Bart van Ingen Schenau và respones Lothar, những lời giải thích tốt nhất cho đến nay có thể là thế này:

Nếu cùng đoàn mang tính chất toàn cầu đang gặp phải trong hai đơn vị dịch (nói , thông qua một tập tin tiêu đề), sau đó làm thế nào có thể One Definition Rule được thỏa mãn? Hai định nghĩa được coi là giống nhau và được hợp nhất với nhau? Hay hai định nghĩa được coi là khác nhau? Nếu chúng được coi là như nhau, thì trình biên dịch có lẽ là làm 'ma thuật' nó không làm khác cho các thực thể khác. Nếu chúng được coi là như nhau, thì trình biên dịch đang làm như vậy mà không có sự đồng ý rõ ràng của lập trình viên ... vì vậy tôi cho rằng sự đồng ý rõ ràng đang bị ép buộc bằng cách yêu cầu nó được khai báo là tĩnh.

Trả lời

1

Tôi đoán là nếu nó được phép để xác định sự kết hợp một cách phi tĩnh nó có thể vi phạm ODR (one definition rule)

+0

Điều này cộng với phản ứng của Bart van Ingen Schenau với nhau có thể là giải thích tốt nhất cho đến nay. – Vatsan

1

Đoán tốt nhất của tôi:

Nếu không tĩnh, có thể được tham chiếu bằng mã khác. Nhưng mã khác sẽ gọi nó là gì? Nó là vô danh. Do đó, cần phải hạn chế một liên minh ẩn danh đối với một số phạm vi địa phương; do đó, nó sẽ được khai báo tĩnh.

Nhưng đó chỉ là phỏng đoán. Nhà thiết kế ngôn ngữ có thể thiết kế mọi thứ theo cách họ muốn. Đôi khi lựa chọn của họ là tùy ý, chỉ vì một số lựa chọn phải được thực hiện.

+0

Tôi không thấy nó được gọi như thế nào trong một phần khác của mã có thể là vấn đề - bởi vì nó không được gọi là bất cứ thứ gì. Thay vào đó, chỉ có các thành viên được tham chiếu trực tiếp, và tất cả họ đều có tên. Chính công đoàn đó là anon, không phải là thành viên của nó. – Vatsan

+0

Tôi đoán tôi đang cố gắng tìm hiểu lý do tại sao tính năng này được thiết kế theo cách đó. BTW hành vi này không phải là mới để C + + 0x (mặc dù tôi đã trích dẫn dự thảo C++ 0x) - nó đã được theo cách này trong một thời bây giờ. – Vatsan

0

$ 9.5/5- Một liên minh của liên minh hình thức { đặc điểm thành viên}; được gọi là một liên minh ẩn danh ; nó định nghĩa một đối tượng chưa được đặt tên của loại chưa đặt tên.

Tôi đoán rằng nó phải là tĩnh để đối tượng có thể được khởi tạo theo quy tắc của các đối tượng tĩnh toàn cục. Nếu nó không phải là tĩnh và các đối tượng không có một tên, sau đó làm thế nào để khởi tạo nó?

EDIT2:

On suy nghĩ lại ...

Các thành viên của đoàn thể nặc danh có liên kết nội bộ. Hơn nữa theo mặc định tên toàn cầu có liên kết bên ngoài, trừ khi họ có liên kết nội bộ. Nếu tên của liên minh ẩn danh có liên kết bên ngoài, các thành viên của liên minh ẩn danh không thể có liên kết nội bộ. Do đó, các công đoàn ẩn danh được khai báo với bộ định danh lớp lưu trữ 'tĩnh' sao cho tên ẩn danh đó có liên kết nội bộ.

+0

damn !. Tôi không biết làm thế nào để thoát khỏi đó đôi 'định nghĩa' – Chubsdad

+0

Làm cho nó tĩnh sẽ cung cấp nó với 'không khởi tạo'. Nhưng tại sao mặc định (không) khởi tạo cần thiết ở tất cả? Các thành viên có thể được gọi bằng tên của họ, vì vậy lần đầu tiên một thành viên của công đoàn anon được chỉ định một giá trị, công đoàn anon sẽ được khởi tạo. Tôi đang thiếu gì? – Vatsan

+0

@Vatsan Madhavan: nhiệm vụ khác với khởi tạo – Chubsdad

4

đoàn vô danh Giả sử không được yêu cầu phải được khai báo tĩnh, và trình biên dịch gặp hai dịch-đơn vị (sau khi tiền xử lý):

File1:

union { 
    int a; 
    char b; 
}; 

// Further contents referring to a and b 

File2:

union { 
    int a; 
    char b; 
}; 

// Further (different) contents referring to a and b 

Hai công đoàn đó có cùng một đối tượng hay chúng được cho là các đối tượng khác nhau?

Tôi nghĩ rằng, để tránh các câu hỏi không được trả lời như thế này, nó đã được quyết định rằng các tổ hợp ẩn danh phạm vi không gian tên phải được khai báo là tĩnh.

+0

Tôi nghĩ rằng điều này, kết hợp với phản ứng ODR của lothar, có thể là giải thích tốt nhất cho đến nay. – Vatsan

-1

Không bao giờ có lý do chính xác cho yêu cầu tĩnh và cần xóa. Trình biên dịch thực hiện và nên xử lý nhiều phần tử trong liên kết dưới dạng nhiều biến toàn cầu riêng lẻ chia sẻ cùng một địa chỉ. Trong thực tiễn nó có nghĩa là trình biên dịch cho phép nhiều loại được áp dụng cho cùng một địa chỉ. Vì phạm vi của một liên minh ẩn danh toàn cầu là phạm vi toàn cầu, các quy tắc đặt tên các phần tử trong các tổ chức vô danh nên (và) giống như các quy tắc để đặt tên các biến toàn cầu. tức là tên của các phần tử công đoàn ẩn danh phải là duy nhất. Đối với việc khởi tạo công đoàn - không có sự khác biệt giữa việc khởi tạo một liên minh và một biến đơn giản. Một điểm khác về các công đoàn tĩnh - giá trị và loại công đoàn phụ thuộc vào thời gian. Lưu ý rằng chỉ một giá trị tại một thời điểm có thể chiếm một liên kết bất kể số lượng phần tử trong đó. Lý do để tuyên bố một liên minh để bắt đầu là cho phép cùng một địa chỉ được sử dụng cho các loại khác nhau, động, vào các thời điểm khác nhau. Đây là lý do tại sao một công đoàn tĩnh là một nhầm lẫn và một số trình biên dịch chỉ đơn giản là bỏ qua nó.

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