Tại sao mọi người sẽ sử dụng C trên C ++? [đóng cửa]


132

Mặc dù mọi người dường như muốn phàn nàn về C ++, tôi không thể tìm thấy nhiều bằng chứng về lý do tại sao bạn muốn chọn C hơn C ++. C dường như không nhận được nhiều flak và nếu C ++ có tất cả những vấn đề này thì tại sao bạn không thể tự giới hạn mình trong tập hợp con C? Suy nghĩ / kinh nghiệm của bạn là gì?


liên kết trùng lặp chính xác không còn hoạt động nữa ..... cho biết anh chàng đến trễ bữa tiệc c :)
kyle

4
C thực sự tốt hơn và đơn giản hơn với C ++ nhưng bất kỳ lập trình viên C nào cũng có thể chuyển đổi C ++ sang C và cười.
BobRun

11
Điều đáng sợ là mọi người nói chung nghĩ rằng "++" có nghĩa là điều này thực sự rất tốt, xin lỗi, không phải vậy.
BobRun

Ngoài ra rõ ràng - các thiết bị nhỏ / nhúng - nói chung C tốt hơn cho các vấn đề crunch số thuần túy (ví dụ: xử lý đồ họa GPU, tính toán vật lý song song ồ ạt, khai thác mẫu, v.v.) trong đó các tính năng OOP là một sự phình to. C ++ tốt hơn cho các hệ thống mô hình hóa nơi 'mọi thứ' tương tác, dễ dàng hơn nhiều với các khả năng OOP.
Paceman

3
Bởi vì JavaScript, các thực tiễn tốt nhất, c ++ và OOP là ngu ngốc / quá bận rộn để cố gắng giải quyết những vấn đề trừu tượng này có lẽ không thực sự tồn tại hoặc cần phải giải quyết bao giờ.
soái ca thủ công

Câu trả lời:


132

Câu trả lời của Joel là tốt vì lý do bạn có thể phải sử dụng C, mặc dù có một vài người khác:

  • Bạn phải đáp ứng các hướng dẫn của ngành, dễ chứng minh và kiểm tra trong C.
  • Bạn có các công cụ để làm việc với C, nhưng không phải C ++ (nghĩ không chỉ về trình biên dịch, mà tất cả các công cụ hỗ trợ, bảo hiểm, phân tích, v.v.)
  • Nhà phát triển mục tiêu của bạn là C gurus
  • Bạn đang viết trình điều khiển, hạt nhân hoặc mã cấp thấp khác
  • Bạn biết trình biên dịch C ++ không tốt trong việc tối ưu hóa loại mã bạn cần viết
  • Ứng dụng của bạn không chỉ không cho vay theo hướng đối tượng mà còn khó viết hơn ở dạng đó

Tuy nhiên, trong một số trường hợp, bạn có thể muốn sử dụng C thay vì C ++:

  • Bạn muốn hiệu năng của trình biên dịch mà không gặp sự cố mã hóa trong trình biên dịch chương trình (C ++, về mặt lý thuyết, có khả năng thực hiện 'hoàn hảo', nhưng các trình biên dịch không thể thấy tối ưu hóa mà một lập trình viên C giỏi sẽ thấy)
  • Phần mềm bạn đang viết là tầm thường, hoặc gần như vậy - xóa sạch trình biên dịch C nhỏ, viết một vài dòng mã, biên dịch và bạn đã sẵn sàng - không cần phải mở một trình soạn thảo lớn với người trợ giúp, không cần phải viết thực tế các lớp trống và vô dụng, xử lý các không gian tên, v.v. Bạn có thể làm gần như tương tự với trình biên dịch C ++ và chỉ cần sử dụng tập hợp con C, nhưng trình biên dịch C ++ chậm hơn, ngay cả đối với các chương trình nhỏ.
  • Bạn cần hiệu năng cực cao hoặc kích thước mã nhỏ và biết trình biên dịch C ++ thực sự sẽ khiến việc thực hiện khó khăn hơn do kích thước và hiệu suất của các thư viện

Bạn cho rằng bạn chỉ có thể sử dụng tập hợp con C và biên dịch với trình biên dịch C ++, nhưng bạn sẽ thấy rằng nếu bạn làm điều đó bạn sẽ nhận được kết quả hơi khác nhau tùy thuộc vào trình biên dịch.

Bất kể, nếu bạn đang làm điều đó, bạn đang sử dụng C. Câu hỏi của bạn có thực sự là "Tại sao các lập trình viên C không sử dụng trình biên dịch C ++?" Nếu đúng như vậy, thì bạn không hiểu sự khác biệt về ngôn ngữ hoặc bạn không hiểu lý thuyết trình biên dịch.


2
Ngoài ra còn có tiêu chuẩn MISRA C, mà AFAIK chưa thực sự ổn định cho C ++.
Paul Nathan

60
Phần hiệu suất không nhất thiết phải đúng. Có rất nhiều lĩnh vực mà C ++ có thể tối ưu hóa tốt hơn nhiều so với C. (Tất nhiên điều ngược lại đôi khi cũng đúng, nhưng nói chung, chọn C trên C ++ vì lý do hiệu suất là một ý tưởng tồi).
jalf

9
Tôi sẽ quan tâm đến nhiều thông tin hiệu suất hơn. Tôi không hiểu tại sao C chỉ hoạt động tốt hơn "thỉnh thoảng". Với một lập trình viên trung bình, có thể C ++ làm cho hiệu suất dễ đạt được hơn (sử dụng tốt các mẫu) nhưng một chương trình C được viết bởi một chuyên gia nên nhanh hơn - chi phí thấp hơn.
Adam Davis

3
Tất nhiên, chương trình C nhanh hơn sẽ mất nhiều thời gian hơn để viết và gỡ lỗi, do đó, có một sự đánh đổi và với tốc độ của máy móc, sự đánh đổi hiếm khi đáng giá trừ các ứng dụng chuyên biệt, đó là lý do tại sao C ++ nói chung tốt hơn. (tại thời điểm mã được thực hiện, máy tính sẽ nhanh hơn và ăn khác)
Adam Davis

21
@Adam: C ++ hoạt động tốt hơn C với mã "khá". C ++ có thể sử dụng các mẫu và hàm nội tuyến trong đó C cần macro. Chi phí C ++ chỉ xuất hiện khi được yêu cầu, nếu không thì giống như C. (ảo, thử / ném, động_cast). Phần lớn chi phí chỉ hiển thị ở kích thước hình ảnh chương trình.
Zan Lynx

88

Tôi thích sự tối giản & đơn giản.


9
OK - đủ công bằng ... vậy tại sao không Forth?
Jonathan Leffler

14
Tôi đoán anh ấy cũng thích có thư viện, sách, diễn đàn có sẵn?
gnud

30
tôi thích sự tối giản và đơn giản trong câu trả lời của bạn ... :)
Joe DF

8
Đồng ý. C rất đơn giản và "nhỏ". C luôn trông giống nhau và nếu bạn là người đóng góp mới cho một dự án, thật dễ hiểu cách thức hoạt động của nó. c ++ có một số thứ vô dụng và khi nhìn vào một dự án c ++ tôi chỉ bị nhầm lẫn ngay lập tức. Tôi có thể hiểu người c ++ (ngôn ngữ C có khả năng OO) nhưng C chỉ đơn giản và dễ dàng hơn.
dùng69969

1
Ngoài ra tôi nghĩ C là một ngôn ngữ phù hợp hơn nhiều để viết một số loại thư viện, như thư viện phổ quát nhỏ, ngôn ngữ kịch bản và, vâng, công cụ kết xuất.
keebus

65
  • Vì họ đã biết C
  • Bởi vì họ đang xây dựng một ứng dụng nhúng cho một nền tảng chỉ có trình biên dịch C
  • Bởi vì họ đang duy trì phần mềm kế thừa được viết bằng C
  • Bạn đang viết một cái gì đó ở cấp độ của một hệ điều hành, một công cụ cơ sở dữ liệu quan hệ hoặc một công cụ trò chơi video 3D bán lẻ.

4
Một số vi điều khiển chỉ có trình biên dịch C thực sự tệ. Các tính năng C ++ cơ bản (không gian tên, các lớp bên cạnh các hàm ảo, enum, khai báo các biến ở nơi khác ngoài đỉnh khối) là giá trị nhất, IMHO.
Jason S

2
Từ đó có vẻ như bạn sẽ chọn C chỉ khi không có lựa chọn thay thế hợp lý.

2
@Joe: ngoài điểm đầu tiên, đó là về tổng hợp nó. Rất nhiều ngôn ngữ sau này đã lấy C và nói, 'này, chúng ta có thể làm tốt hơn .'
Joel Coehoorn

1
Đã đồng ý. Nếu bạn không sử dụng các tính năng C ++ phức tạp, tôi tin rằng C ++ đơn điệu hơn C. Với các tính năng C ++ phức tạp hơn, mọi thứ sẽ gây tranh cãi hơn, nhưng sau đó, cuộc tranh luận thường so với mức độ trừu tượng cao hơn - ví dụ, Java.
Paul Nathan

4
Trên thực tế, hầu hết các công cụ trò chơi 3D đều sử dụng C ++. UE4 sử dụng C ++, chủ yếu.
Aditya Kashi

56

Những lo ngại về hiệu suất hoặc sự phình to không phải là lý do chính đáng để từ bỏ C ++. Mọi ngôn ngữ đều có những cạm bẫy tiềm tàng và sự đánh đổi - các lập trình viên giỏi tìm hiểu về những điều này và khi cần phát triển các chiến lược đối phó, các lập trình viên nghèo sẽ phạm lỗi và đổ lỗi cho ngôn ngữ.

Python được giải thích theo nhiều cách được coi là ngôn ngữ "chậm", nhưng đối với các tác vụ không tầm thường, lập trình viên Python có kỹ năng có thể dễ dàng tạo mã thực thi nhanh hơn so với nhà phát triển C thiếu kinh nghiệm.

Trong ngành công nghiệp của tôi, trò chơi video, chúng tôi viết mã hiệu suất cao trong C ++ bằng cách tránh những thứ như RTTI, ngoại lệ hoặc hàm ảo trong các vòng lặp bên trong. Đây có thể là cực kỳ hữu ích nhưng có vấn đề hiệu suất hoặc phình to mà nó muốn tránh. Nếu chúng ta tiến thêm một bước và chuyển hoàn toàn sang C, chúng ta sẽ thu được rất ít và mất đi các cấu trúc hữu ích nhất của C ++.

Lý do thực tế lớn nhất để thích C là sự hỗ trợ rộng rãi hơn C ++. Có nhiều nền tảng, đặc biệt là các nền tảng được nhúng, thậm chí không có trình biên dịch C ++.

Ngoài ra còn có vấn đề tương thích cho các nhà cung cấp. Trong khi C có ABI (Giao diện nhị phân ứng dụng) ổn định và được xác định rõ thì C ++ không có. ABI trong C ++ phức tạp hơn do những thứ như vtables và construcurs / phá hủy do đó được triển khai khác nhau với mọi nhà cung cấp và thậm chí các phiên bản của chuỗi công cụ của nhà cung cấp.

Trong thực tế, điều này có nghĩa là bạn không thể lấy một thư viện được tạo bởi một trình biên dịch và liên kết nó với mã hoặc thư viện từ một trình biên dịch khác tạo ra cơn ác mộng cho các dự án phân tán hoặc nhà cung cấp phần mềm trung gian của thư viện nhị phân.


7
"Python được giải thích theo nhiều cách được coi là ngôn ngữ" chậm ", nhưng đối với các tác vụ không tầm thường, lập trình viên Python có kỹ năng có thể dễ dàng tạo mã thực thi nhanh hơn so với nhà phát triển C thiếu kinh nghiệm." Tôi đoán một lập trình viên (không nhất thiết là một Progammer Python) đã học các bài học thuật toán có thể tạo ra mã thực thi nhanh hơn so với một nhà phát triển thiếu kinh nghiệm (nói chung).
Andrei Ciobanu

15
Và cùng một c dev thiếu kinh nghiệm sẽ tạo ra mã python chậm hơn mã c của anh ta. Python chậm hơn c.
Millie Smith

37

Tôi chọn viết bằng C vì tôi thích làm việc với một ngôn ngữ nhỏ, chặt chẽ. Tôi thích có quyền truy cập vào một tiêu chuẩn có thể được đọc trong một khoảng thời gian hợp lý (đối với tôi - tôi là một người đọc rất chậm). Hơn nữa, tôi sử dụng nó để viết phần mềm cho các hệ thống nhúng mà ít trình biên dịch C ++ mong muốn tồn tại (như một số bộ điều khiển vi PIC).


re: PICs - Tôi cảm thấy nỗi đau của bạn. Nếu tôi phải làm nhiều mã PIC, có lẽ tôi sẽ sử dụng trình biên dịch IAR hỗ trợ C ++. Tôi đã sử dụng nó trên MSP430 và nó khá đẹp.
Jason S

1
Và đừng quên thời gian biên dịch được cải thiện rất nhiều cho C. Không có hệ thống mẫu.
Kỹ sư

35

Tôi có quan điểm khác: tại sao sử dụng C ++ thay vì C?

Cuốn sách Ngôn ngữ lập trình C (hay còn gọi là: K & R) cho bạn biết rõ cách thực hiện mọi thứ mà ngôn ngữ có thể làm trong dưới 300 trang. Đó là một kiệt tác của chủ nghĩa tối giản. Không có cuốn sách C ++ nào đến gần.

Phản biện rõ ràng là hầu hết đều có thể nói giống nhau, nếu không nói là tất cả, các ngôn ngữ hiện đại - chúng cũng không thể cho bạn biết cách làm mọi thứ chỉ trong vài trăm trang. Thật. Vậy tại sao nên sử dụng C ++ thay thế? Tính năng phong phú? Quyền lực? Nếu bạn cần một cái gì đó nhiều tính năng phong phú hoặc mạnh mẽ hơn thì hãy đi với C #, Objective C, Java hoặc một cái gì đó tương tự. Tại sao gánh nặng cho bản thân với sự phức tạp của C ++? Nếu bạn cần mức độ kiểm soát cấp C ++ thì tôi lập luận sử dụng C. C có thể làm bất cứ điều gì và có thể làm tốt.


Tôi đồng ý. Tôi muốn sức mạnh vì vậy tôi sử dụng một cái gì đó thực sự mạnh mẽ, không phải là điểm 1/2.
Dinah

7
@Dinah: Điểm 1/2 cung cấp cho bạn sức mạnh biểu hiện mức cao hơn mà không cần chi phí hiệu năng và bộ nhớ của C # hoặc Java.
Zan Lynx

5
@Zan Lynx: bạn nói đúng. Nhưng tôi hy vọng bằng cách đưa ra lập trường đối lập mà tôi đã làm trong bài viết gốc của mình rằng tôi đã đưa ra quan điểm về khả năng tồn tại của C so với C ++ ... ngay cả khi đó là, như bạn chỉ ra, không phải là một trường hợp mở và đóng.
Dinah

28

Ngoài một số điểm khác đã được đề cập:

Ít bất ngờ

có nghĩa là, nó là dễ dàng hơn nhiều để xem những gì một đoạn mã sẽ làm làm chính xác . Trong C ++, bạn cần tiếp cận cấp độ guru để có thể biết chính xác trình biên dịch tạo ra mã nào (thử kết hợp các mẫu, nhiều kế thừa, hàm tạo tự động, hàm ảo và trộn một chút ma thuật không gian tên và tra cứu phụ thuộc đối số).

Trong nhiều trường hợp, phép thuật này rất hay, nhưng ví dụ trong các hệ thống thời gian thực, nó thực sự có thể làm hỏng ngày của bạn.


27

Câu trả lời của Linus cho câu hỏi của bạn là "Bởi vì C ++ là một ngôn ngữ khủng khiếp"

Bằng chứng của anh ấy là giai thoại tốt nhất, nhưng anh ấy có một điểm ..

Là ngôn ngữ cấp thấp hơn, bạn thích ngôn ngữ này hơn C ++. C ++ là C có thêm thư viện và trình biên dịch hỗ trợ cho các tính năng bổ sung ( cả hai ngôn ngữ đều có tính năng mà ngôn ngữ khác không có và triển khai mọi thứ khác nhau ), nhưng nếu bạn có thời gian và kinh nghiệm với C, bạn có thể hưởng lợi từ các quyền hạn liên quan ở cấp độ thấp thêm ... [Đã chỉnh sửa] (vì bạn đã quen với việc thực hiện nhiều công việc thủ công hơn là hưởng lợi từ một số quyền hạn đến từ chính ngôn ngữ / trình biên dịch)

Thêm liên kết:

Tại sao C ++ cho nhúng

Tại sao bạn vẫn sử dụng C? PDF

Tôi sẽ google cho điều này .. bởi vì có rất nhiều bình luận trên web


17
Tôi đã thực hiện rất nhiều mã hóa bằng C, sau đó là một khoảng thời gian ngắn trong C ++, sau đó là một khoảng thời gian dài vô tận với VB, và bây giờ tôi đã sử dụng C # trong vài năm qua. Tôi đã viết một chút mã C và C ++ kể từ đó và tôi nhận ra rằng C được xác định rõ ràng và chặt chẽ, C # rất tuyệt vời và mạnh mẽ, và C ++ chỉ hút.
CMPalmer

25
Linus không thực sự đủ điều kiện để nói về giá trị của C ++. Trích dẫn anh ta như thể anh ta là một loại tiên tri chỉ là ngu ngốc. Và một chút về "làm mọi thứ một cách khó khăn" không có ý nghĩa. Có nhiều lý do tốt để sử dụng C, nhưng "đó là công việc nhiều hơn" hoặc "Linus đã nói như vậy" không nằm trong số đó.
jalf

8
@jalf, không trích dẫn Linus như thể anh ta là một nhà tiên tri nào đó, thật tốt khi đề cập đến ý kiến ​​của một lập trình viên biết về sự lựa chọn của anh ta trong một trong những chương trình được sử dụng nhiều nhất trên thế giới: kernel linux. Câu hỏi hỏi ý kiến ​​(tại sao ai đó chọn C) đó là những gì tôi nhắm đến để trả lời.
Ric Tokyo

6
Linus là một nguồn không tốt cho các ý kiến ​​về C ++ vì anh ta không sử dụng nó và theo như tôi biết, chỉ thử nó một lần vào năm 1990 - một cái gì đó.
Zan Lynx

3
@Zan Linus hiển thị nhiều quyền tự kiểm soát hơn ở nơi khác: "Chúng tôi muốn sử dụng C ++ và các tính năng bổ sung mà nó mang lại, nhưng khó thấy mã xấu trong C ++ hơn ở đâu trong C". Câu trích dẫn trong câu trả lời của tôi là một bản ghi ý kiến ​​chứ không phải là "đi theo người lãnh đạo".
Ric Tokyo

26

Bởi vì họ đang viết một plugin và C ++ không có ABI tiêu chuẩn.


9
Mặc dù đúng, đó không phải là một lý do thuyết phục để gắn bó với C vì bạn có thể xuất các chức năng cần thiết bằng cách sử dụng liên kết C và vẫn tiếp tục triển khai trong C ++.
codelogic

2
@codelogic - Các dự án C ++ có xu hướng xuất nhiều loại và chức năng hơn các dự án C tương đương. Có thể che giấu điều này trong một thư viện chia sẻ cuối cùng, nhưng nó hoàn toàn có thể nỗ lực nhiều hơn giá trị của nó.
Tom

tbh không phải là một câu trả lời thực sự tốt nhưng +1 vì C ++ không có ABI tiêu chuẩn (vâng .. C ++ tệ hại)
hasen

6
C cũng không có ABI tiêu chuẩn.
Stephen Canon

25

Thời gian biên dịch dài có thể gây phiền nhiễu. Với C ++, bạn có thể có thời gian biên dịch rất dài (tất nhiên, điều đó có nghĩa là có nhiều thời gian hơn cho Stack Overflow!).


Tại sao điều này được bỏ phiếu xuống? Bản thân tôi làm rất nhiều công việc trong C ++ và tôi sẽ không quay lại C, nhưng nó thực sự có thể có thời gian biên dịch rất dài (ví dụ như nghĩ về các mẫu).
Frank

6
Tôi sử dụng C ++ cho công việc thực tế, nhưng tôi luôn tạo nguyên mẫu trong C vì thời gian biên dịch gần như tức thời.
Tom

Hmm, khi được thực hiện đúng cách, tức là không bị cồng kềnh, chúng ta có thể cần những thứ này - bao gồm và không chắc chắn-đó-là-phải-bao gồm-vì-tôi-sẽ-bao-cả-# bao gồm thời gian biên dịch được gọn gàng. Khi tôi hack một hoặc ba tệp, tôi chỉ mất 1-2 giây để biên dịch 100 dự án KLOC của mình.
Sebastian Mach

4
@Tom: Tôi tự hỏi C ++ thực sự của bạn trông như thế nào, nếu bạn có thể tạo nguyên mẫu trong C. Bạn không sử dụng khả năng của C ++? Bạn có thể xây dựng?
Sebastian Mach

24

Tôi đã từng sử dụng C ++ cho các dự án của mình. Sau đó, tôi đã nhận được một công việc trong đó đơn giản C được sử dụng (một cơ sở mã phát triển 20 năm của một phần mềm AV có tài liệu kém ...).

3 điều tôi thích ở C là:

  • Không có gì là ẩn: bạn thấy chính xác những gì chương trình của bạn làm hoặc không làm. Điều này làm cho việc gỡ lỗi dễ dàng hơn.

  • Việc thiếu không gian tên và quá tải có thể là một lợi thế: nếu bạn muốn biết một hàm được gọi ở đâu, chỉ cần grep qua thư mục mã nguồn và nó sẽ cho bạn biết. Không có công cụ đặc biệt khác cần thiết.

  • Tôi đã khám phá lại sức mạnh của các con trỏ hàm. Về cơ bản, chúng cho phép bạn thực hiện tất cả các công cụ đa hình mà bạn làm trong C ++, nhưng chúng thậm chí còn linh hoạt hơn.


8
+1 Tuy nhiên tính đa hình như vậy trong C thường thu được thông qua void *, điều này rất nguy hiểm vì nó vô hiệu hóa bất kỳ khả năng nào của trình biên dịch để kiểm tra xem bạn có đang làm điều gì khó chịu không.
gd1

4
@ gd1 Trong thực tế tôi không thể nhớ một trường hợp duy nhất khi điều này void*gây ra sự cố. Có nhiều kỹ thuật lập trình phòng thủ để bảo vệ chống lại sai lầm: đặt các xác nhận ở mọi nơi, thêm số ma thuật vào cấu trúc của bạn (trong các bản dựng gỡ lỗi), v.v. Nhưng ngày nay chúng ta có valgrind, dr. bộ nhớ và thậm chí MSVC cung cấp mã để phát hiện các vấn đề, vì vậy các vấn đề hỏng bộ nhớ là khá dễ dàng để sắp xếp.
Calmarius

4
Tôi gần như không bao giờ gặp phải tình trạng hỏng bộ nhớ trong các chương trình của mình, nhưng nếu có thể tôi muốn phát hiện ra các lỗi sai trước khi chạy chương trình. Đúc void*đến whatever*là một cái gì đó trình biên dịch chấp nhận trong đức tin tốt. Tôi thích trình biên dịch của tôi không tin tưởng tôi và có khả năng thực thi kiểm tra loại mạnh mẽ. Lỗi thay thế mẫu do trình biên dịch C ++ phát hành rất khó đọc nhưng ít nhất rác không được biên dịch.
gd1

1
@ gd1 Quay lại nhận xét đầu tiên của bạn, tôi không biết bạn có bao nhiêu kinh nghiệm với các kỹ thuật thủ tục (Tôi thấy bạn đang hoạt động trong hầu hết các thẻ OO). Việc void*thường có thể tránh được. Mẫu điển hình khi thêm hành vi tùy chỉnh là truyền con trỏ hàm và void*dữ liệu người dùng. Một giao diện chung thường trông như thế này. Sau đó, thư viện khi chuyển nó void*trở lại cuộc gọi lại của bạn mà không làm gì khác với nó. Thông thường, bạn không có bất kỳ dữ liệu bổ sung nào, vì vậy bạn vượt qua NULL và bỏ qua tham số người dùng trong cuộc gọi lại của bạn. Tôi đoán rằng bạn biết điều này.
Calmarius

@Calmarius "Thông thường bạn không có thêm bất kỳ dữ liệu nào" -> Đây thực sự là lợi thế của đa hình. Thật dễ dàng để liên kết dữ liệu bổ sung, mà không cần sử dụng con trỏ void. Vì vậy, lý do của bạn về cơ bản là "Tôi không thực sự sử dụng tính năng đó."
dùng2445507

15

Tôi ngạc nhiên không có thư viện đề cập đến. Rất nhiều ngôn ngữ có thể liên kết với C libs và gọi các hàm C (bao gồm C ++ với "C" bên ngoài). C ++ gần như là thứ duy nhất có thể sử dụng lib C ++ (được định nghĩa là lib một lib sử dụng các tính năng trong C ++ không có trong C [như các hàm bị quá tải, các phương thức ảo, toán tử quá tải, ...] và không xuất mọi thứ thông qua các giao diện tương thích C thông qua "C" 'bên ngoài.


1
Không phải vậy; bạn có thể thực hiện "C" hoặc __cdecl các chức năng của mình để hiển thị chúng cho C.
Crashworks

Tuyệt vời, nhưng những ngôn ngữ khác làm việc với?
BigSandwich

2
một lib C có thể làm việc ở nhiều nơi hơn.
BigSandwich

1
Tất cả những cái có thể liên kết đến C.
Crashworks

2
Lý do rõ ràng nhất cho các vấn đề về khả năng tương tác là xáo trộn tên và tôi nghĩ rằng điều đó đáng để đưa lên.
Tom

15

Nếu bạn muốn mã của bạn được hiểu bởi hầu như bất kỳ lập trình viên nào viết bằng C.


12

Bởi vì họ muốn sử dụng các tính năng trong C99 không có tương đương trong C ++.


Tuy nhiên, không có nhiều tính năng C99 hữu ích cho C ++ như mọi người nghĩ ngay từ cái nhìn đầu tiên. Mảng có độ dài thay đổi? C ++ có std :: vectơ. Hỗ trợ cho số phức / tưởng tượng? C ++ có kiểu phức tạp templated. Hàm toán tổng quát loại? C ++ đã quá tải các hàm toán học tiêu chuẩn, gây ra kết quả tương tự.

Đặt tên khởi tạo? Không phải trong C ++, nhưng có một cách giải quyết:

struct My_class_params {
    int i;
    long j;
    std::string name;

    My_class_params& set_i(int ii)
    {
        i = ii;
        return *this;
    }

    My_class_params& set_j(long jj)
    {
        j = jj;
        return *this;
    }


    template <typename STRING>
    My_class_params& set_name(STRING&& n)
    {
        name = std::forward<STRING>(n);
        return *this;
    }

    My_class_params()
    {
        // set defaults
    }
};

class My_class {
    My_class_params params;
  public:
    My_class(const My_class_params& p) : params(p) { }
    ...
};

Điều này cho phép bạn viết những thứ như:

My_class mc(My_class_params().set_i(5).set_name("Me"));

Nghe, nghe! Việc thiếu các trình khởi tạo được chỉ định trong C ++ sẽ đẩy tôi lên tường mỗi khi tôi phải sử dụng nó.
ephemient

2
Tôi với 100% trên các công cụ khởi tạo !!!
Thẩm phán Maygarden

Nếu bạn muốn khởi tạo cấu trúc toàn cầu bên ngoài hàm (vì vậy bạn không thể .set _ * ()), C ++ buộc bạn phải sử dụng cú pháp khởi tạo không tên hoặc viết một hàm tạo cho cấu trúc của bạn. Tôi không thích một trong những lựa chọn đó.
ephemient

Ngoài ra còn có các VLA trong C99 (GCC) dễ làm việc hơn nhiều std:vector.
Vahid Amiri

10

Bởi vì đối với nhiều tác vụ lập trình, C đơn giản hơn và đủ tốt. Khi tôi đang lập trình các tiện ích nhẹ đặc biệt, tôi có thể cảm thấy như C ++ muốn tôi xây dựng một cấu trúc siêu thanh lịch cho mục đích riêng của mình, thay vì chỉ đơn giản là viết mã.

OTOH, đối với các dự án phức tạp hơn, sự thanh lịch cung cấp sự chặt chẽ về cấu trúc vững chắc tốt hơn so với việc chảy ra khỏi bàn phím của tôi một cách tự nhiên.


8

Hầu hết các tính năng quan trọng của c ++ bằng cách nào đó liên quan đến các lớp hoặc mẫu. Đây là những tính năng tuyệt vời ngoại trừ cách trình biên dịch biến chúng thành mã đối tượng. Hầu hết các trình biên dịch sử dụng xáo trộn tên và những trình biên dịch không làm gì đó ít nhất là lộn xộn.

Nếu hệ thống của bạn tự hoạt động, như trường hợp của nhiều ứng dụng, thì C ++ là một lựa chọn tốt.

Nếu hệ thống của bạn cần tương tác với phần mềm không được viết bằng C ++ (thường xuyên nhất là trong trình biên dịch chương trình, hoặc Thư viện Fortran) thì bạn đang ở trong tình trạng khó khăn. Để tương tác với các loại trường hợp đó, bạn sẽ cần phải tắt chức năng xáo trộn tên cho các biểu tượng đó. điều này thường được thực hiện bằng cách khai báo các đối tượng đóextern "C" , nhưng sau đó chúng không thể là các mẫu, các hàm quá tải hoặc các lớp. Nếu đó có thể là API ứng dụng của bạn, thì bạn sẽ phải bọc chúng bằng các hàm trợ giúp và giữ cho các chức năng đó đồng bộ với các triển khai thực tế.

Và trong thực tế, ngôn ngữ C ++ cung cấp một cú pháp tiêu chuẩn cho các tính năng có thể dễ dàng thực hiện trong C.

Nói tóm lại, chi phí hoạt động của C ++ có thể tương tác là quá cao đối với hầu hết mọi người để biện minh.


3
Tôi rất giật mình khi nghe điều này bởi vì tôi đã viết rất nhiều .DLL trong C ++ có giao diện "C" bên ngoài để chúng có thể được gọi từ C hoặc bất kỳ ngôn ngữ CLR nào khác. Chắc chắn bạn không thể đơn giản để lộ con trỏ hàm thành viên, nhưng thực sự không có nhiều rắc rối về dữ liệu thống kê cho cuộc gọi __cdecl.
Crashworks

1
Trên thực tế, bạn có thể xuất mã templated. Nó chỉ yêu cầu các hàm bao hàm không có templated cho mọi loại bạn muốn sử dụng để tránh xung đột tên.
Thẩm phán Maygarden

8

Điều này khá nông cạn nhưng là một sinh viên bận rộn, tôi đã chọn C vì tôi nghĩ C ++ sẽ mất quá nhiều thời gian để học. Nhiều giáo sư tại trường đại học của tôi sẽ không chấp nhận các bài tập trong Python và tôi cần phải nhanh chóng nhận được một cái gì đó.


8
Khôn ngoan của các giáo viên của bạn!
Andrei Ciobanu

6

Một nhận xét về "chỉ sử dụng tập hợp con của C ++ mà bạn muốn sử dụng": vấn đề với ý tưởng này là nó có chi phí để thực thi rằng mọi người trong dự án đều sử dụng cùng một tập hợp con. Ý kiến ​​riêng của tôi là những chi phí đó khá cao cho các dự án được ghép lỏng lẻo (ví dụ như các dự án nguồn mở) và C ++ hoàn toàn thất bại trong việc trở thành một C tốt hơn, theo nghĩa là bạn không thể sử dụng C ++ ở bất cứ nơi nào bạn sử dụng C.


6

Ôi trời, C vs C ++, một cách tuyệt vời để bắt đầu một cuộc chiến rực lửa. :)

Tôi nghĩ rằng C là tốt hơn cho trình điều khiển và mã nhúng.

C ++ có một số tính năng tuyệt vời mà C không có, nhưng nhiều tính năng hướng đối tượng của C ++ có thể gây ra sự lộn xộn mã hóa hoành tráng khi mọi người viết mã với các tác dụng phụ không rõ ràng xảy ra đằng sau hậu trường. Mã điên có thể được ẩn trong các hàm tạo, hàm hủy, hàm ảo, ... Vẻ đẹp của mã C là ngôn ngữ không có gì không rõ ràng đằng sau lưng của bạn, do đó bạn có thể đọc mã và không phải tìm kiếm mọi hàm tạo và hàm hủy và như thế. Rất nhiều vấn đề là thực hành mã hóa xấu bởi MỘT SỐ người.

Ngôn ngữ hoàn hảo của tôi sẽ là sự kết hợp của C99 cộng với một tập hợp con tối thiểu các khả năng C ++ an toàn hơn, bổ sung thêm trình biên dịch ZERO (hoặc gần 0) cho đầu ra nhị phân. Bổ sung hoàn hảo sẽ là đóng gói lớp và đặt tên các khái niệm về dữ liệu và hàm.


Đặt tên là C + hoặc C100: _)
m3nda

4

Tôi chưa thể tìm thấy nhiều bằng chứng về lý do tại sao bạn muốn chọn C hơn C ++.

Bạn khó có thể gọi những gì tôi sắp nói bằng chứng; đó chỉ là ý kiến ​​của tôi

Mọi người thích C vì nó phù hợp độc đáo trong tâm trí của người lập trình.

Có nhiều quy tắc phức tạp của C ++ [khi nào bạn cần các hàm hủy ảo, khi nào bạn có thể gọi các phương thức ảo trong một hàm tạo, làm thế nào để quá tải và ghi đè tương tác, ...] và để làm chủ tất cả chúng phải mất rất nhiều nỗ lực. Ngoài ra, giữa các tham chiếu, nạp chồng toán tử và nạp chồng hàm, hiểu một đoạn mã có thể yêu cầu bạn hiểu mã khác có thể dễ hoặc không tìm thấy.

Một câu hỏi khác nhau tại sao các tổ chức sẽ thích C hơn C ++. Tôi không biết rằng, tôi chỉ là một người ;-)

Để bảo vệ C ++, nó mang lại các tính năng có giá trị cho bảng; Mặc dù vậy, cái tôi đánh giá cao nhất có lẽ là đa hình tham số ('ish): các hoạt động và loại lấy một hoặc nhiều loại làm đối số.


2
++score: Tuyên bố của bạn Những người thích C vì nó phù hợp độc đáo trong tâm trí của lập trình viên là một tuyên bố rất độc đáo. Có thể lập trình bằng một ngôn ngữ đơn giản mà bạn biết rằng những gì bạn thấy là những gì bạn nhận được là một tài sản thực sự hấp dẫn cho một ngôn ngữ lập trình.
tchrist

3

Tôi có thể nói rằng C cung cấp cho bạn quyền kiểm soát tối ưu hóa và hiệu quả tốt hơn C ++ và do đó sẽ hữu ích trong các tình huống mà bộ nhớ và các tài nguyên khác bị hạn chế và mọi tối ưu hóa đều giúp ích. Nó cũng có một dấu chân nhỏ hơn tất nhiên.


Bạn có thể cho ví dụ về những điều này?
Andrew Grant

Vậy cùng một mã C được biên dịch bằng trình biên dịch C sẽ hiệu quả hơn nếu được biên dịch bằng trình biên dịch C ++?
Steve Kuo

1
Nhiều năm trước, nhân Linux có thể được biên dịch bằng gcc hoặc g ++, nhưng g ++ đã tạo mã chậm hơn ( tux.org/lkml/#s15-3 trong "Cuối cùng, trong khi Linus duy trì hạt nhân phát triển ...").
Max Lybbert

Tôi cho rằng tôi đã suy nghĩ nhiều hơn về khả năng kiểm soát nhiều hơn về cách mã của bạn được tối ưu hóa trong C so với C ++. Giống như cách một lập trình viên sử dụng ngôn ngữ hợp ngữ có thể tinh chỉnh mã của mình chính xác hơn so với một người sử dụng ngôn ngữ cấp cao hơn.
Chris

2

Ngoài ra còn có cách tiếp cận mà một số cửa hàng sử dụng một số tính năng của C ++ theo cách giống như C, nhưng tránh những thứ bị phản đối. Ví dụ, sử dụng các lớp và phương thức lớp và nạp chồng hàm (thường dễ dàng đối với các bế tắc C để đối phó), nhưng không phải là STL, toán tử luồng và Boost (khó học hơn và có thể có các đặc điểm bộ nhớ xấu).


1

Bởi vì bạn đang viết cho một hệ thống có tài nguyên chặt chẽ (chẳng hạn như hệ thống nhúng hoặc một loại mã kim loại trần thực sự nào đó như hạt nhân) và bạn muốn có càng ít chi phí càng tốt.

Có một lý do tại sao hầu hết các hệ thống nhúng không có trình biên dịch C ++ - không phải mọi người không muốn, đó là việc nhồi nhét mã C ++ vào một không gian nhỏ đó là nhiệm vụ không thể tiếp cận.


3
Không thực sự là một vấn đề của chính C ++ như một ngôn ngữ, nhưng sự phình to bệnh lý mà việc sử dụng các mẫu bừa bãi có thể gây ra.
Crashworks

1
ecos phần lớn được viết bằng C ++. Không có mối quan hệ giữa ngôn ngữ (so với C) và kích thước thực thi (miễn là bạn biết những tính năng sẽ sử dụng).
dùng52875

1
"Miễn là bạn biết những tính năng để sử dụng". Đó là vấn đề - kết quả của việc nói "tốt, chúng tôi có C ++, nhưng chúng tôi không thể hỗ trợ một nửa các tính năng ngôn ngữ vì lý do trên không" là Symbian / C ++, gây nhầm lẫn và giận dữ cho cả lập trình viên C lập trình viên C ++ ...
Steve Jessop

1
Đồng ý trên tất cả các điểm. Giải pháp của chúng tôi để "biết những tính năng nào sẽ sử dụng" là chỉ sử dụng trình biên dịch C và gọi nó là một ngày. Chắc chắn, chúng tôi có thể đã làm cho C ++ hoạt động, (điều này thực sự thú vị theo cách siêu mọt sách) nhưng chúng tôi đã có một sản phẩm để xuất xưởng, và không có thời gian để lo lắng về điều đó.
Electrons_Ahoy

1

Những gì C cần là một tiền xử lý tốt hơn. cfront là một và do đó sinh ra c ++

Tôi sẽ sử dụng C, trong đó 'c ++ là tiền xử lý' sẽ không ổn.

Tôi khá chắc chắn, ở dưới cùng của bất kỳ thư viện / khung / bộ công cụ c ++ nào được viết tốt, bạn sẽ tìm thấy bẩn-old-c (hoặc phôi tĩnh, giống nhau)


0
  • Cho đến vài năm trước, các trình biên dịch C ++ hiện tại đã thiếu các tính năng quan trọng hoặc khả năng hỗ trợ kém và các tính năng được hỗ trợ rất khác nhau giữa chúng và vì vậy rất khó để viết các ứng dụng di động.
  • Do không có cách đặt tên biểu tượng chuẩn nên các ngôn ngữ / ứng dụng khác khó có thể hỗ trợ trực tiếp các lớp 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.