Sự khác biệt giữa vòng loại const trong C và vòng loại const trong C ++ là gì?


9

Tôi đã tìm thấy một nhận xét của người dùng R .. :

C và C ++ không cùng ngôn ngữ. Đặc biệt, C constkhông liên quan gì đến C ++ const.

Tôi biết, một điểm khác biệt giữa constvòng loại trong C và constvòng loại trong C ++ là liên kết mặc định của nó.

Một đối tượng được khai báo ở phạm vi không gian tên với constvòng loại trong C ++ có liên kết bên trong, trong khi ở C, một đối tượng có constvòng loại được khai báo ở phạm vi toàn cầu (không có staticvòng loại trước const) có liên kết ngoài.

Nhưng làm thế nào khác cả hai khác nhau giữa các ngôn ngữ của C và C ++? Tôi đã nghĩ rằng cả hai đều có cùng một loại khái niệm và mục đích trong cả hai ngôn ngữ.

Câu hỏi của tôi:

  • Sự khác biệt giữa vòng loại const trong C và vòng loại const trong C ++ là gì?

Câu trả lời cho "const" khác nhau như thế nào trong C và C ++? không chỉ ra sự khác biệt chính xác giữa các ngôn ngữ của C và C ++ trong ngữ cảnh của constvòng loại. Chỉ những gì bạn có thể làm được hoặc có thể làm với nó bằng một ngôn ngữ nhất định.


Vì vậy, nhiều câu trả lời chỉ là một tìm kiếm Google. Một trong số đó: stackoverflow.com/questions/4486442/ từ
schaiba

1
Trong C, constkhông có gì để làm với liên kết. Bạn có thể có static constphạm vi tập tin và nó có liên kết nội bộ,
Lundin

3
Nếu bạn không hài lòng với câu trả lời hiện tại cho câu hỏi đó - giống như câu trả lời của bạn - hãy xem xét việc đăng tiền thưởng cho nó.
Sneftel

3
Tôi đồng ý rằng các bản sao được liên kết là xấu. Một câu trả lời tốt sẽ liệt kê tất cả các khác biệt và không giải thích quá nhiều về những gì constgiống nhau trong cả hai ngôn ngữ.
Lundin

1
Tôi có thể cố gắng viết một câu trả lời như vậy nhưng tôi không đủ chuyên gia về C ++ để chắc chắn rằng tôi có tất cả sự khác biệt. Trên đỉnh đầu của tôi: các biến const trong C ++ là các biểu thức không đổi, không giống như trong C. C ++ có thể tạo thành các hàm thành viên đủ điều kiện. Các liên kết được đề cập. Còn gì nữa không?
Lundin

Câu trả lời:


11
  • Sự khác biệt quan trọng nhất là trong C ++, một constbiến là một biểu thức không đổi (ngay cả trước khi giới thiệu C ++ 11 constexpr), nhưng một constbiến trong C thì không.

    Có nghĩa là C ++ cho phép bạn làm những việc như thế const size_t n = 1; static int array[n];nhưng C không cho phép điều đó, được cho là vì lý do lịch sử.

  • Trong C ++, constđóng một phần trong việc xác định liên kết. Điều này khác nhau giữa các phiên bản C ++. Theo cppreference.com (nhấn mạnh của tôi):

    Bất kỳ tên nào sau đây được khai báo ở phạm vi không gian tên đều có liên kết bên trong:


    • các biến không phải mẫu không biến động (kể từ C ++ 14) không nội tuyến (kể từ C ++ 17) các biến không đủ điều kiện (kể từ C ++ 20) (bao gồm cả constexpr) không được khai báo bên ngoài và aren ' t trước đây đã tuyên bố có liên kết bên ngoài;

    Trong khi đó ở C, consthoàn toàn không đóng vai trò trong việc xác định mối liên kết - chỉ có phạm vi khai báo và chỉ định lớp lưu trữ.

  • Trong C ++, bạn có thể constđủ điều kiện các chức năng thành viên. Điều này không thể có trong C vì nó không có hỗ trợ cú pháp cho các hàm thành viên.

  • C cho phép constcác biến đủ tiêu chuẩn được khai báo mà không cần bộ khởi tạo. Trong C, chúng ta có thể viết const int x;mà không cần khởi tạo, nhưng C ++ không cho phép điều đó. Nhìn thoáng qua, điều này có vẻ như là một lỗi ngôn ngữ vô nghĩa trong C, nhưng lý do là các máy tính có các thanh ghi phần cứng chỉ đọc với các giá trị được đặt bởi phần cứng, không phải phần mềm. Có nghĩa là C vẫn phù hợp với lập trình liên quan đến phần cứng.


Bạn có thể có chức năng thành viên trong C?
Maxim Egorushkin

1
Lưu ý rằng const size_t n = 1; static int array[n];chỉ hoạt động nếu trình biên dịch có thể thấy định nghĩa nvà thực hiện lan truyền không đổi. extern const size_t n; static int array[n];không hoạt động.
Maxim Egorushkin

Hừm, tôi thay vì thấy các thanh ghi phần cứng như vậy được xử lý thông qua con trỏ, chẳng hạn như uint32_t const* x = reinterpret_cast<uint32_t const*>(20102012);...
Aconcagua

@Aconcagua Điều đó sẽ làm cho các thanh ghi như vậy không tương thích với phần còn lại của bản đồ đăng ký. Và làm thế nào điều đó cho phép bạn xem các giá trị đăng ký thực tế trong trình gỡ lỗi? Ví dụ: nếu bạn chỉ muốn xem các thanh ghi bộ mặt nạ silicon chỉ đọc để nhanh chóng xem phần bạn đã kết thúc. Và rõ ràng, bạn cũng cần phải volatileđủ điều kiện con trỏ.
Lundin

@Lundin Đã thừa nhận, đã không chú ý đến volatile... Phần còn lại phụ thuộc. Các trình gỡ lỗi tôi có bằng tay trong các trường hợp này cũng có thể dễ dàng giải quyết *x. Mặt khác, nếu các thanh ghi được ánh xạ tới một số vùng nhớ và trình biên dịch không hỗ trợ trực tiếp đặt các biến tại các vị trí bộ nhớ cụ thể (tôi đã thấy cả hai), việc lấy biến tại một vị trí bộ nhớ cụ thể đôi khi có thể hơi lộn xộn (phải che nó trong tệp bản đồ ...). Cuối cùng, tôi không quan tâm lắm đến việc có một biến được đặt ở đúng vị trí hoặc một con trỏ, miễn là tôi có thể nhận được nhiệm vụ mà tôi được giao;)
Aconcagua

0

Từ cppreference.com :

Vòng constloại được sử dụng trên một khai báo của một biến không phải là mẫu không biến động (từ C ++ 14) không nội tuyến (kể từ C ++ 17) không được khai báo externmang lại cho nó liên kết bên trong. Điều này khác với C trong đó constcác biến phạm vi tệp có liên kết ngoài.

Khác với điều đó constcó cùng ngữ nghĩa trong các tiêu đề C và C ++ và C constthường được biên dịch thành các tiêu đề C ++ với điều kiện "extern C".


1
Đó là một trích dẫn xấu, quá đơn giản. static const x;tại phạm vi tập tin trong C có liên kết nội bộ. Liên kết của một biến C được xác định bởi phạm vi được khai báo, cũng như sự hiện diện / vắng mặt của các bộ chỉ định lớp lưu trữ. constvà các loại vòng loại khác hoàn toàn không phải là một phần của nó.
Lundin

@Lundin Nó khác với những gì trích dẫn nói?
Maxim Egorushkin

1
Ví dụ tôi vừa đưa ra chứng minh trích dẫn sai. Theo trích dẫn, static const x;tại phạm vi tập tin trong C có liên kết bên ngoài.
Lundin

@Lundin Trích dẫn nói rằng int const x = 1trong C có liên kết bên ngoài . Do đó, bạn cần staticthay đổi liên kết thành nội bộ. Các trích dẫn là khá rõ ràng với tôi, không giống như ý kiến ​​của bạn.
Maxim Egorushkin

1
Nó thực sự không nói điều đó cả. Đọc đoạn trích dẫn. "... C trong đó các biến phạm vi tệp const có liên kết ngoài".
Lundin
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.