toàn cầu tĩnh và không gian tên ẩn danh trong C ++


11
  1. Tại sao C ++ tạo ra bất kỳ sự khác biệt nào giữa các quả cầu tĩnh (liên kết bên trong) và các ký hiệu trong một không gian tên không tên (liên kết ngoài, nhưng không có cách nào đề cập đến nó từ bên ngoài), khi giới thiệu cái sau?

  2. Có bất kỳ lý do nào trong số đó vẫn còn hiệu lực, hoặc có những lý do mới?

  3. Có nơi nào còn lại nơi chúng vẫn khác nhau nhưng quy tắc tùy tiện mà các hiệp hội toàn cầu ẩn danh (hoặc phạm vi không gian tên) phải làstatic , và chúng là gì?

  4. Đối với điểm thưởng, nếu không có lý do chính đáng nào để chúng khác biệt, liệu có yêu cầu làm cho chúng tương đương không?


Khi C ++ giới thiệu các không gian tên (C ++ 98) và các không gian tên không được đặt tên cụ thể, các quả cầu tĩnh bị phản đối là lỗi thời và kém hơn so với điều mới trong sự nhiệt tình, mặc dù điều đó đã được hoàn nguyên với C ++ 11 :
Không dùng từ khóa tĩnh không còn nữa

Trước C ++ 11, các biểu tượng có liên kết bên trong không thể được sử dụng làm đối số mẫu: Tại sao C ++ 03 yêu cầu tham số mẫu phải có liên kết ngoài?


Có vẻ như bạn chủ yếu trả lời câu hỏi của riêng bạn, ngoại trừ bit "thực hiện tuân thủ"; có lẽ bạn nên xem xét loại bỏ nửa thứ hai và gửi nó như một câu trả lời thay thế? Hay vẫn còn một cái gì đó chưa được trả lời ở đây?
Kyle Strand

@KyleStrand Cải tổ tất cả.
Ded repeatator

Câu trả lời:


3

Tôi không cho rằng câu trả lời này cho tất cả các câu hỏi của bạn (hoặc bất kỳ câu hỏi nào trong số chúng?), Nhưng sự khác biệt chính giữa khai báo tĩnh cấp tệp và không gian tên ẩn danh là không gian tên cũng áp dụng cho các loại (bạn không thể khai báo một staticloại trong cùng một nghĩa là bạn khai báo một biến), đó là lý do tại sao không gian tên được ưa thích, do đó, có một thành ngữ duy nhất để khai báo các kiểu và dữ liệu trong phạm vi tệp.

Ví dụ, mã sau đây sẽ biên dịch tốt. (Không thực sự hữu ích, vì bạn không thể phân biệt giữa cả hai loại, nhưng được phép)

#include <iostream>

struct Foobar
{
    int   foo;
    float bar;
};

namespace
{

struct Foobar
{
    double baz;
};

} // namespace

int main()
{
    std::cout << "HELLO!\n";
}

Một thử nghiệm trực tiếp ở đây .


Nó biên dịch vì bạn không sử dụng Foobar trong chức năng chính.
dshil

Quan trọng hơn điều gì xảy ra nếu một tệp .cpp khác tuyên bố phiên bản của chính nó struct Foobar? Tệ hơn nữa, giả sử bây giờ class Foobar. Hãy suy nghĩ về cách bạn dự định tạo ra các nhà xây dựng cho cả hai.
thức
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.