- Tôi có nên ngừng sử dụng thuật ngữ C / C ++ không?
Chắc chắn rồi. Không rõ cấu trúc này được dùng để thể hiện điều gì ngoại trừ, có lẽ, sự nhầm lẫn về những gì C và C ++ thay mặt cho người sử dụng thuật ngữ này.
Vì sự nhầm lẫn này là một nguồn thất vọng phổ biến như vậy, nhiều người đã trở nên khá xúc động về nó và sự xuất hiện của thuật ngữ đó sẽ là lý do đủ để họ trở nên tiêu cực về sự đóng góp của bạn. Điều này có vẻ ngớ ngẩn nhưng nó dường như là những gì chúng ta có.
Tôi khuyên bạn thay vì nói về chuyện C / C ++, bạn nên sử dụng một thuật ngữ thực sự làm rõ ý của bạn.
Nếu bạn đang nói về một cái gì đó trong C mà có thể hoặc có thể không còn đúng cho C ++, chỉ cần nói C .
Ví dụ: Làm thế nào nên main
chức năng được khai báo trong C?
Lúc đầu, có vẻ như câu trả lời cho C ++ là giống nhau: int main()
hoặc int main(int, char**)
. Nhưng khi cuộc thảo luận diễn ra, có thể có liên quan để chỉ ra rằng trong C ++, hàm phải được khai báo ở phạm vi toàn cầu, điều này không có ý nghĩa gì trong C, vì nó không có namespace
s. Mặt khác, C cho phép gọi main
đệ quy trong khi C ++ thì không. Trong C ++, có một ẩn ý return 0;
nếu bạn bỏ rơi ra main
nhưng trong C thì return
câu lệnh được yêu cầu trên bất kỳ đường dẫn nào. Danh sách này tiếp tục và nó làm cho cuộc thảo luận đơn giản hơn nhiều nếu bạn làm cho nó rõ ràng về ngôn ngữ sẽ được thảo luận.
Nếu bạn đang nói về điều gì đó trong C ++ có thể đúng hoặc có thể không đúng với C, chỉ cần nói C ++ .
Ví dụ: Một malloc()
mảng ed của int
s ban đầu có phải là số không trong C ++ không?
Câu trả lời ngắn gọn cho C xảy ra giống nhau: không. Nhưng khi câu trả lời tiếp tục, có thể đáng để chỉ ra rằng trong C, calloc
sẽ là một lựa chọn tốt trong khi ở C ++, sử dụng một từ std::vector<int>
có thể là lựa chọn tốt hơn ngay từ đầu.
Nếu bạn muốn chỉ ra sự tương đồng giữa C và C ++, hãy nói C và C ++ .
Ví dụ: Trong C và C ++, sizeof
an int
được triển khai được xác định và có thể khác nhau giữa các trình biên dịch và kiến trúc.
Ở đây, chúng tôi muốn chỉ ra rằng C và C ++ hành xử giống nhau. Chúng tôi đang nói rõ ràng về cả hai ngôn ngữ.
Tôi thực sự khuyên bạn nên cụ thể hơn nữa và không chỉ nói về C C hay hay C ++, mà còn là phiên bản chính xác. Cả hai ngôn ngữ đang phát triển và một tuyên bố thẳng thừng như
C ++ hỗ trợ /* … */
và // …
bình luận trong khi C chỉ hỗ trợ /* … */
kiểu.
không đúng cũng không sai.
- Nếu câu trả lời cho # 1 là có, làm thế nào tôi có thể gọi một chương trình sử dụng kết hợp C và C ++?
Vì các ngôn ngữ có sự trùng lặp, mọi chương trình C sẽ chứa các phần có thể trông giống C ++ và ngược lại. Tuy nhiên, các tác giả có thể đã quyết định sử dụng trình biên dịch C hoặc C ++. Vì vậy, nói rằng chương trình được viết bằng CÊ nếu nó được biên dịch bằng trình biên dịch C và chương trình được viết bằng C ++, nếu họ sử dụng trình biên dịch C ++, ngay cả khi họ có thể từ chối sử dụng bất kỳ tính năng C ++ hiện đại nào. Một số người đề cập đến như C ++ mã như C-style C ++ . Không có quá tải, ngoại lệ, đa hình, mẫu và luồng I / O một đặc điểm chung của mã đó.
Thay vào đó, nếu một số tệp được viết bằng C và được biên dịch bằng trình biên dịch C và một số tệp khác được viết bằng C ++ và được biên dịch bằng trình biên dịch C ++, sau đó các tệp đối tượng được liên kết với nhau, tôi sẽ nói rằng chương trình được viết bằng một kết hợp giữa C và C ++ , như trên thực tế, bạn đã làm.
Tuy nhiên, nếu, thay vào đó, các tác giả đã hết sức cẩn thận để viết từng tệp theo cách có thể được biên dịch bằng trình biên dịch C hoặc C ++ và chương trình kết quả sẽ làm điều tương tự, bạn có thể nói rằng chương trình đó được viết trong một tập hợp con phổ biến của C và C ++ .
Cái sau thường là trường hợp cho các tệp tiêu đề nên được chia sẻ giữa mã C và C ++. Nhân tiện, viết mã như vậy không dễ. Nếu bạn muốn tiếp tục nhấn mạnh rằng chỉ có cấu trúc như vậy đã được sử dụng đó là hợp lệ trong C và C ++ và được hỗ trợ rộng rãi bởi các nhà cung cấp trình biên dịch khác nhau, thuật ngữ một xách tay tập hợp con chung của C và C ++ có thể được sử dụng để nhấn mạnh điều này.
- Cho rằng cả hai ngôn ngữ này đều khác nhau, có khả năng các trình biên dịch C ++ dừng hỗ trợ mã được viết bằng ngôn ngữ C (vì C ++ hiện đại đang chuyển hướng khỏi tâm lý C cho các công cụ cơ bản như con trỏ, xử lý bộ nhớ động, v.v.)?
Tôi không chắc là tôi hiểu câu hỏi này. Vì C và C ++ là các ngôn ngữ khác nhau, bạn không thể mong đợi trình biên dịch cho một trong số chúng chấp nhận một chương trình được viết cho ngôn ngữ kia. Tuy nhiên, trình biên dịch thường được thiết kế theo cách mô-đun và nếu một trình biên dịch có C ++ front-end , rất có thể là tốt nó cũng sẽ có một C front-end. (Sau đó, bạn sẽ chọn ngôn ngữ nào bạn muốn thông qua một công tắc dòng lệnh hoặc phương tiện tương tự.) Miễn là cả hai ngôn ngữ sẽ được sử dụng rộng rãi, có vẻ như điều này sẽ không thay đổi. Quan điểm của bạn về hiện đại của C ++, tôi nghĩ về cơ bản là vấn đề về tiêu chuẩn mã hóa tốt và thư viện chuẩn. Từ quan điểm của nhà soạn nhạc , sự phát triển của cả hai ngôn ngữ khá hội tụ hơn là chuyển hướng.
- Hiện tại có sự hợp tác nào giữa những người tạo ra các tiêu chuẩn của C / C ++ để giữ tính tương thích không?
Đúng. Mô hình bộ nhớ và thư viện hoạt động nguyên tử được giới thiệu trong C ++ 11 và C11 là một ví dụ điển hình. Dường như các nhà thiết kế của cả hai ngôn ngữ nhận ra rằng khả năng tương thích là quan trọng và đang nỗ lực cải thiện nó. Cá nhân, tôi muốn rằng sự hợp tác sẽ mạnh mẽ hơn và hai nhóm làm việc ISO thậm chí có thể tham gia nhưng mong muốn của tôi không quan trọng.
Bjarne Stroustrup nói về sự khác biệt và tương đồng giữa các phiên bản khác nhau của C và C ++ trong § 44.3 của phiên bản thứ 4 của Ngôn ngữ lập trình C ++ , trớ trêu thay, có tựa đề là Tương thích C / C ++. Sử dụng thuật ngữ có thể thực sự phù hợp trong trường hợp này vì nó rõ ràng có nghĩa là gì.
- Nếu số 4 là có, sự hợp tác như vậy có thể kết thúc trong tương lai gần với sự xuất hiện của C ++ hiện đại (14/11/17)
Như đã thảo luận ở trên, nó đã xảy ra trong C ++ 11 và được mong đợi / hy vọng / cần thiết để xảy ra lần nữa.