2013-09-05 38 views
5

Gần đây tôi đã khám phá trong C11 và nhiều tính năng mới giúp tôi mã hóa C dễ dàng hơn. Tôi tự hỏi TẤT CẢ những tính năng này được chính thức hỗ trợ bởi C++ 11. Mối quan tâm của tôi không phải là về vấn đề triển khai hay biên dịch mà là tiêu chuẩn C++ mới.C++ 11 có hỗ trợ các tính năng mới của C11 không?

+0

Một số, nhưng chúng là hai ngôn ngữ riêng biệt. – chris

+0

Tính năng nào, cụ thể? Một số tính năng C mới cũng có tính năng trong C++ (nhưng không đảm bảo, vì @chris nói chúng là ngôn ngữ độc lập.) –

+1

Tôi quen thuộc với C++ 11 nhưng không phải với C11: nó sẽ giúp bạn biết những gì bạn đang tìm kiếm cho. Ngoài ra, có một số lĩnh vực mà hai ngôn ngữ theo đuổi các cách tiếp cận và tính năng khác nhau sẽ không ánh xạ từ C đến C++. –

Trả lời

5

Không, C++ 11 không hỗ trợ TẤT CẢ các tính năng của C11. Nó thậm chí không hỗ trợ tất cả các tính năng của C99. Ví dụ, các mảng biến đổi độ dài được giới thiệu trong C99, nhưng C++ chưa hỗ trợ chúng. Xem this question để biết chi tiết.

+0

Các mảng có độ dài thay đổi được dự kiến ​​cho C++ 14 (chỉ để cung cấp khung thời gian cho câu lệnh của bạn). – zneak

+0

@zneak: Không, "các mảng thời gian chạy bị ràng buộc" được xem xét cho C++ không giống với VLA của C. –

+0

@BenVoigt, [N3820] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3820.html#dcl.array) bao gồm ví dụ về biểu mẫu 'int foo [ n] 'với một hằng số' n'. Tôi nên nhận biết sự khác biệt nào? Tôi thấy rằng nó không còn dự kiến ​​cho C++ 14, mặc dù. – zneak

1

Tiêu chuẩn C++ 11 tham chiếu tiêu chuẩn C99, đặc biệt đối với thư viện chuẩn C.

C++ 11 hỗ trợ một số, nhưng không phải tất cả, trong số các tính năng có trong C99 nhưng không có trong C90. (Một số tính năng cụ thể của C99 hoặc được hỗ trợ khác nhau trong C++ hoặc không được cho là phù hợp.)

C11 đã thêm một số tính năng ở trên cùng của C99; hầu hết các tính năng mới này là không phải cũng được thêm vào C++.

Một ngoại lệ đáng chú ý cho điều này là hỗ trợ luồng (<threads.h> trong C11, <thread> trong C++ 11). Tôi đã không xem xét điều này đủ chặt để biết chúng giống nhau như thế nào.

(C11 cũng thực hiện một số các tính năng mới của nó, cũng như một số tính năng C99, tùy chọn;. Mà cũng không được phản ánh trong C++)

+2

Sự hiểu biết của tôi là C11 đã thêm hỗ trợ luồng, cả dưới dạng hỗ trợ ngôn ngữ và các thành phần sử dụng để xử lý các chủ đề và đồng bộ hóa nguyên thủy. Tôi nghĩ rằng tất cả các tính năng này là C++ mặc dù các thông số kỹ thuật không nhất thiết phải giống nhau giữa C và C++. –

+0

Có một loạt các thứ nhỏ khác nữa, như cấu trúc ẩn danh, không có hàm trả về, một số biểu thức kiểu chung và kiểu tương tự. Và, quan trọng nhất của tất cả, nó cuối cùng đã thoát khỏi 'gets()'. –

+0

C11 thêm C + + 11 chủ đề hỗ trợ (và nguyên tử) nhiều hơn so với đối diện;) –

2

Trong số những bổ sung lớn, hai được chia sẻ giữa C11 và C + +11: chủ đề và nguyên tử. Tôi cũng nghĩ rằng mô hình trình tự bộ nhớ mới được chia sẻ giữa hai, nhưng tôi không biết C++ 11 đủ tốt để khẳng định điều đó một cách chắc chắn.

Một bổ sung chính cho C11 có thể sẽ không bao giờ được chia sẻ bởi C++: nhập biểu thức chung với _Generic. Đối với nhiều trường hợp sử dụng của điều đó, trong quá tải hàm cụ thể, đã có các cấu trúc C++ thực hiện điều đó. Các trường hợp sử dụng phức tạp hơn khác như phát hiện các biểu thức hằng số hằng số biên dịch không được bao hàm bởi C++. C++ 1 có constexpr, nhưng khác với tên có thể gợi ý đây không phải là công cụ để xác định xem biểu thức có phải là biểu thức không đổi hay không, nhưng để xác định rằng đối tượng hoặc hàm trả về là hằng số. Tạo mã hoàn toàn khác nhau cho hai trường hợp (không đổi và không liên tục) dường như không thể.

Không chỉ có _Generic là không cần thiết cho các trường hợp sử dụng chính trong C++, nó cũng dựa nhiều vào lập trình macro trong giai đoạn tiền xử lý. Kể từ khi macro được tán thành bởi các phần lớn của cộng đồng C++ thêm rằng chắc chắn sẽ không tìm thấy sự đồng thuận.

+0

downvoted. C++ 11 có thể phát hiện các biểu thức hằng số biên dịch với 'constexpr'. – TemplateRex

+0

@TemplateRex, tôi sẽ xem xét điều đó, trong cách so sánh với tính năng C. Downvoting cho một điều như vậy mà không cho tôi thời gian để sửa chữa, có vẻ hơi cực đoan. Bạn có cơ hội nào theo đuổi tôi xuống ngày cuối cùng và bỏ phiếu về một số câu trả lời cũ mà tôi đã đưa ra từ nhiều năm trước không? –

+0

không, tôi cố gắng luôn để lại nhận xét và tôi thường kiểm tra lại nếu có cập nhật về câu trả lời, để tôi có thể rút lại bất kỳ phiếu giảm giá nào. Về các downvotes khác, tôi nghĩ rằng bạn có một vài người trong C++ chat Lounge khó chịu đêm qua với chỉnh sửa thẻ của bạn trong [câu hỏi này] (http://stackoverflow.com/q/19120326/819272), nơi hai câu trả lời được bình chọn hàng đầu (bao gồm cả một trong số tôi) cũng đã được giảm giá cùng một lúc (* không * bình luận). – TemplateRex

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