Mengapa ada yang menggunakan C lebih dari C ++? [Tutup]


132

Meskipun orang-orang tampaknya suka mengeluh tentang C ++, saya belum dapat menemukan banyak bukti mengapa Anda ingin memilih C daripada C ++. C tampaknya tidak mendapatkan banyak kritik dan jika C ++ memiliki semua masalah ini mengapa Anda tidak bisa membatasi diri Anda sendiri ke subset C? Apa pendapat / pengalaman Anda?


duplikat link yang tepat tidak lagi berfungsi ..... kata orang yang terlambat ke pesta c :)
kyle

4
C benar-benar lebih baik dan lebih sederhana untuk C ++ tetapi setiap programmer C dapat mengkonversi C ++ ke C dan tertawa.
BobRun

11
Yang menakutkan adalah orang-orang pada umumnya berpikir "++" berarti ini benar-benar baik, maaf tidak.
BobRun

Terlepas dari jelas - perangkat kecil / tertanam - umumnya C lebih baik untuk masalah angka murni (misalnya pemrosesan grafis GPU, perhitungan fisika paralel masif, penambangan pola dll) di mana fitur OOP adalah mengasapi. C ++ lebih baik untuk sistem pemodelan di mana 'benda' berinteraksi, lebih mudah dengan kemampuan OOP.
Paceman

3
Karena JavaScript, praktik terbaik, c ++, dan OOP bodoh / terlalu sibuk mencoba menyelesaikan masalah abstrak ini yang mungkin tidak benar-benar ada atau perlu dipecahkan.
kerajinan Marshal

Jawaban:


132

Jawaban Joel baik untuk alasan Anda mungkin harus menggunakan C, meskipun ada beberapa yang lain:

  • Anda harus memenuhi pedoman industri, yang lebih mudah dibuktikan dan diuji dalam C.
  • Anda memiliki alat untuk bekerja dengan C, tetapi bukan C ++ (anggap bukan hanya tentang kompiler, tetapi semua alat pendukung, cakupan, analisis, dll)
  • Pengembang target Anda adalah guru C
  • Anda sedang menulis driver, kernel, atau kode tingkat rendah lainnya
  • Anda tahu kompiler C ++ tidak pandai mengoptimalkan jenis kode yang perlu Anda tulis
  • Aplikasi Anda tidak hanya cenderung berorientasi objek, tetapi akan lebih sulit untuk ditulis dalam bentuk itu

Namun, dalam beberapa kasus, Anda mungkin ingin menggunakan C daripada C ++:

  • Anda ingin kinerja assembler tanpa kesulitan pengkodean dalam assembler (C ++ secara teori mampu kinerja 'sempurna', tetapi kompiler tidak begitu baik dalam melihat optimasi, seorang programmer C yang baik akan melihat)
  • Perangkat lunak yang Anda tulis itu sepele, atau hampir sama - mencabut kompiler C kecil, menulis beberapa baris kode, kompilasi dan Anda sudah siap - tidak perlu membuka editor besar dengan pembantu, tidak perlu menulis secara praktis kelas kosong dan tidak berguna, berurusan dengan ruang nama, dll. Anda dapat melakukan hal yang hampir sama dengan kompiler C ++ dan cukup menggunakan subset C, tetapi kompiler C ++ lebih lambat, bahkan untuk program kecil.
  • Anda memerlukan kinerja ekstrem atau ukuran kode kecil, dan tahu kompiler C ++ sebenarnya akan membuatnya lebih sulit untuk diselesaikan karena ukuran dan kinerja perpustakaan

Anda berpendapat bahwa Anda hanya bisa menggunakan subset C dan kompilasi dengan kompiler C ++, tetapi Anda akan menemukan bahwa jika Anda melakukannya, Anda akan mendapatkan hasil yang sedikit berbeda tergantung pada kompiler.

Apapun, jika Anda melakukan itu, Anda menggunakan C. Apakah pertanyaan Anda benar-benar "Mengapa tidak programmer C menggunakan kompiler C ++?" Jika ya, berarti Anda tidak mengerti perbedaan bahasa, atau Anda tidak mengerti teori kompiler.


2
Ada juga standar MISRA C, yang AFAIK belum benar-benar stabil untuk C ++.
Paul Nathan

60
Bagian kinerja belum tentu benar. Ada banyak area di mana C ++ dapat mengoptimalkan jauh lebih baik daripada C. (Tentu saja kebalikannya juga kadang-kadang benar, tetapi umumnya, memilih C daripada C ++ untuk alasan kinerja adalah ide yang buruk).
jalf

9
Saya akan tertarik pada informasi kinerja lebih lanjut. Saya tidak mengerti mengapa C hanya akan tampil lebih baik "sesekali." Diberikan programmer rata-rata, mungkin C ++ membuat kinerja lebih mudah untuk dicapai (penggunaan pola yang baik) tetapi program C yang ditulis oleh seorang ahli harus lebih cepat - overhead yang lebih rendah.
Adam Davis

3
Tentu saja, program C yang lebih cepat akan membutuhkan waktu lebih lama untuk menulis dan men-debug, jadi ada tradeoff, dan mengingat kecepatan mesin tradeoff jarang sepadan kecuali untuk aplikasi khusus, itulah sebabnya C ++ umumnya lebih baik. (Pada saat kode selesai, komputer lebih cepat dan memakan dif)
Adam Davis

21
@ Adam: C ++ berkinerja lebih baik daripada C dengan kode "cantik". C ++ dapat menggunakan templat dan fungsi sebaris di mana C membutuhkan makro. C ++ overhead hanya muncul ketika diminta, jika tidak sama dengan C. (virtual, try / throw, dynamic_cast). Banyak overhead hanya menunjukkan ukuran gambar program.
Zan Lynx

88

Saya suka minimalis & kesederhanaan.


9
OK - cukup adil ... jadi mengapa tidak Keempat?
Jonathan Leffler

14
Saya kira dia juga suka memiliki perpustakaan, buku, forum tersedia?
gnud

30
Saya suka minimalis & kesederhanaan jawaban Anda ... :)
Joe DF

8
Setuju. C sangat sederhana dan "kecil". C selalu terlihat sama dan jika Anda adalah kontributor baru pada suatu proyek, mudah untuk memahami cara kerjanya. c ++ memiliki banyak hal yang tidak berguna dan ketika melihat proyek c ++ saya langsung bingung. Saya dapat memahami orang-orang c ++ (bahasa C dengan kemampuan OO) tetapi C hanya lebih sederhana dan mudah.
user69969

1
Juga saya pikir C adalah bahasa yang jauh lebih cocok untuk menulis beberapa jenis perpustakaan, seperti perpustakaan universal kecil, bahasa scripting dan, ya, mesin rendering.
keebus

65
  • Karena mereka sudah tahu C
  • Karena mereka sedang membangun aplikasi tertanam untuk platform yang hanya memiliki kompiler C
  • Karena mereka memelihara perangkat lunak lama yang ditulis dalam bahasa C
  • Anda sedang menulis sesuatu pada level sistem operasi, mesin basis data relasional, atau mesin permainan video 3D ritel.

4
Beberapa mikrokontroler hanya memiliki kompiler C yang benar-benar menyebalkan. Fitur dasar C ++ (ruang nama, kelas selain fungsi virtual, enum, mendeklarasikan variabel di tempat lain selain top-of-block) adalah yang paling berharga, IMHO.
Jason S

2
Dari sini sepertinya Anda akan memilih C hanya jika tidak ada alternatif yang masuk akal.

2
@ Jo: selain dari poin pertama, itu tentang jumlah itu. Banyak bahasa kemudian mengambil C dan berkata, "hei, kita bisa melakukan yang lebih baik ."
Joel Coehoorn

1
Sepakat. Jika Anda tidak menggunakan fitur C ++ yang canggih, saya percaya bahwa C ++ secara monoton lebih baik C. Dengan fitur C ++ yang lebih canggih, hal-hal menjadi lebih bisa diperdebatkan, tetapi kemudian perdebatan biasanya versus tingkat abstraksi yang lebih tinggi - misalnya, Jawa.
Paul Nathan

4
Kebanyakan mesin game 3D menggunakan C ++, sebenarnya. UE4 menggunakan C ++, sebagian besar.
Aditya Kashi

56

Ketakutan akan kinerja atau mengasapi bukan alasan yang baik untuk melupakan C ++. Setiap bahasa memiliki potensi jebakan dan pertukaran - pemrogram yang baik belajar tentang ini dan jika perlu mengembangkan strategi koping, pemrogram yang buruk akan jatuh busuk dan menyalahkan bahasa.

Python yang ditafsirkan dalam banyak hal dianggap sebagai bahasa "lambat", tetapi untuk tugas-tugas non-sepele seorang programmer Python yang terampil dapat dengan mudah menghasilkan kode yang mengeksekusi lebih cepat daripada yang dilakukan oleh pengembang C yang tidak berpengalaman.

Di industri saya, video game, kami menulis kode kinerja tinggi dalam C ++ dengan menghindari hal-hal seperti RTTI, pengecualian, atau fungsi virtual di loop batin. Ini bisa sangat berguna tetapi memiliki masalah kinerja atau mengasapi yang diinginkan untuk dihindari. Jika kita melangkah lebih jauh dan beralih sepenuhnya ke C kita akan mendapatkan sedikit dan kehilangan konstruksi yang paling berguna dari C ++.

Alasan praktis terbesar untuk memilih C adalah bahwa dukungan lebih luas daripada C ++. Ada banyak platform, terutama yang tertanam, yang bahkan tidak memiliki kompiler C ++.

Ada juga masalah kompatibilitas untuk vendor. Sementara C memiliki ABI yang stabil dan didefinisikan dengan baik (Application Binary Interface) C ++ tidak. ABI dalam C ++ lebih rumit karena hal-hal seperti vtables dan konstruk / destruktor sehingga diimplementasikan secara berbeda dengan setiap vendor, dan bahkan versi dari vendor toolchain.

Dalam istilah nyata ini berarti Anda tidak dapat mengambil perpustakaan yang dihasilkan oleh satu kompiler dan menautkannya dengan kode atau perpustakaan dari yang lain yang menciptakan mimpi buruk untuk proyek-proyek yang didistribusikan atau penyedia middleware dari perpustakaan biner.


7
"Python yang diinterpretasikan dalam banyak hal dianggap sebagai bahasa" lambat ", tetapi untuk tugas-tugas non-sepele seorang programmer Python yang terampil dapat dengan mudah menghasilkan kode yang dieksekusi lebih cepat dari pada pengembang C yang tidak berpengalaman." Saya kira seorang programmer (tidak harus Python Progammer) yang mengambil pelajaran algoritma dapat menghasilkan kode yang mengeksekusi lebih cepat daripada pengembang yang tidak berpengalaman (secara umum).
Andrei Ciobanu

15
Dan itu c dev berpengalaman yang sama akan menghasilkan kode python yang lebih lambat dari kode c-nya. Python jauh lebih lambat daripada c.
Millie Smith

37

Saya memilih untuk menulis dalam bahasa C karena saya senang bekerja dengan bahasa yang kecil dan kencang. Saya suka memiliki akses ke standar yang dapat dibaca dalam jumlah waktu yang wajar (bagi saya - saya pembaca yang sangat lambat). Selain itu, saya menggunakannya untuk menulis perangkat lunak untuk sistem tertanam yang ada beberapa kompiler C ++ yang diinginkan (seperti beberapa kontroler mikro PIC).


re: PICs - Saya merasakan sakit Anda. Jika saya harus melakukan banyak kode PIC, saya mungkin akan menggunakan kompiler IAR yang mendukung C ++. Saya sudah menggunakannya di MSP430 dan itu cukup bagus.
Jason S

1
Dan jangan lupa waktu kompilasi yang jauh lebih baik untuk C. Tidak ada sistem template.
Insinyur

35

Saya mengambil pandangan lain: mengapa menggunakan C ++ bukannya C?

Buku The C Programming Language (alias: K&R) memberi tahu Anda dengan jelas bagaimana melakukan segala hal yang dapat dilakukan bahasa di bawah 300 halaman. Ini adalah karya minimalis. Buku C ++ bahkan tidak ada yang mendekati.

Pertentangan yang jelas adalah bahwa hal yang sama dapat dikatakan untuk sebagian besar, jika tidak semua, bahasa modern - mereka juga tidak dapat memberi tahu Anda bagaimana melakukan semuanya hanya dalam beberapa ratus halaman. Benar. Jadi mengapa menggunakan C ++? Kekayaan fitur? Kekuasaan? Jika Anda membutuhkan sesuatu yang lebih kaya fitur atau bertenaga kemudian pergi dengan C #, Objective C, Java, atau sesuatu yang lain seperti itu. Mengapa membebani diri Anda dengan kompleksitas C ++? Jika Anda memerlukan tingkat kontrol hibah C ++ maka saya berpendapat untuk menggunakan C. C dapat melakukan apa saja dan dapat melakukannya dengan baik.


Saya setuju. Saya ingin kekuatan jadi saya menggunakan sesuatu yang benar-benar kuat, bukan titik 1/2 cara.
Dinah

7
@Dinah: Titik 1/2 way memberi Anda kekuatan ekspresi level yang lebih tinggi tanpa kinerja dan biaya memori C # atau Java.
Zan Lynx

5
@ Zan Lynx: Anda benar. Tapi saya berharap dengan mengambil sikap berlawanan yang saya lakukan di posting asli saya bahwa saya membuat poin tentang kelangsungan hidup C lebih dari C + + ... bahkan jika itu, seperti yang Anda tunjukkan, bukan kasus buka dan tutup.
Dinah

28

Selain beberapa poin lain yang sudah disebutkan:

Kurang mengejutkan

yaitu, jauh lebih mudah untuk melihat apa sepotong kode akan melakukan melakukan persis . Di C ++ Anda perlu mendekati level guru untuk dapat mengetahui dengan pasti kode apa yang dihasilkan oleh kompiler (coba kombinasi templat, pewarisan berganda, konstruktor yang dibuat secara otomatis, fungsi virtual dan campur dalam sedikit namespace magic dan pencarian yang bergantung pada argumen).

Dalam banyak kasus, sihir ini bagus, tetapi misalnya dalam sistem waktu-nyata itu dapat benar-benar mengacaukan hari Anda.


27

Jawaban Linus untuk pertanyaan Anda adalah "Karena C ++ adalah bahasa yang mengerikan"

Buktinya adalah anekdotal, tetapi dia ada benarnya ..

Menjadi lebih dari bahasa tingkat rendah, Anda akan lebih suka ke C ++ .. C ++ adalah C dengan menambahkan perpustakaan dan dukungan kompiler untuk fitur tambahan ( kedua bahasa memiliki fitur yang tidak dimiliki bahasa lain, dan menerapkan hal-hal yang berbeda ), tetapi jika Anda memiliki waktu dan pengalaman dengan C, Anda dapat mengambil manfaat dari tambahan kekuatan terkait tingkat rendah tambahan ... [Diedit] (karena Anda terbiasa melakukan lebih banyak pekerjaan secara manual daripada mengambil manfaat dari beberapa kekuatan yang berasal dari bahasa / kompiler itu sendiri)

Menambahkan tautan:

Mengapa C ++ untuk disematkan

Mengapa Anda masih menggunakan C? PDF

Saya akan google untuk ini .. karena sudah ada banyak komentar di web


17
Saya melakukan banyak pengkodean dalam C, kemudian periode singkat dalam C ++, kemudian waktu yang sangat memalukan dengan VB, dan sekarang saya telah menggunakan C # selama beberapa tahun terakhir. Saya telah menulis sedikit kode C dan C ++ sejak saat itu dan saya menyadari bahwa C terdefinisi dengan baik dan ketat, C # keren dan kuat, dan C ++ hanya menyebalkan.
CMPalmer

25
Linus tidak benar-benar memenuhi syarat untuk berbicara tentang kelebihan C ++. Mengutipnya seolah-olah dia semacam oracle adalah hal yang bodoh. Dan sedikit tentang "melakukan sesuatu dengan cara yang sulit" tidak masuk akal. Ada alasan bagus untuk menggunakan C, tetapi "ini lebih banyak pekerjaan", atau "Linus berkata begitu" tidak ada di antara mereka.
jalf

8
@jalf, tidak mengutip Linus seolah-olah dia semacam oracle, ada baiknya menyebutkan pendapat seorang programmer yang mengetahui pilihannya di salah satu program yang paling banyak digunakan di dunia: kernel linux. Pertanyaan itu menanyakan pendapat (mengapa seseorang memilih C) itu yang ingin saya jawab.
Ric Tokyo

6
Linus adalah sumber yang buruk untuk pendapat tentang C ++ karena dia tidak menggunakannya dan sejauh yang saya tahu, hanya mencobanya sekali pada 1990-an.
Zan Lynx

3
@Zan Linus menampilkan lebih banyak kontrol diri di tempat lain: "Kami ingin menggunakan C ++ dan fitur tambahan yang dibawanya, tetapi lebih sulit untuk melihat di mana kode buruk di C ++ daripada di C". Kutipan pada jawaban saya adalah catatan pendapat daripada "ikuti pemimpin".
Ric Tokyo

26

Karena mereka sedang menulis sebuah plugin dan C ++ tidak memiliki ABI standar.


9
Meskipun benar, ini bukan alasan yang meyakinkan untuk tetap menggunakan C karena Anda dapat mengekspor fungsi yang diperlukan menggunakan tautan C dan tetap mempertahankan implementasi Anda di C ++.
codelogic

2
@codelogic - proyek C ++ cenderung mengekspor lebih banyak jenis dan fungsi daripada proyek C yang setara. Dimungkinkan untuk menyembunyikan ini di perpustakaan bersama terakhir, tetapi sangat mungkin lebih banyak upaya daripada nilainya.
Tom

tbh bukan jawaban yang benar-benar bagus tetapi +1 karena C ++ tidak memiliki ABI standar (ya .. C ++ menyebalkan)
Hasen

6
C juga tidak memiliki ABI standar.
Stephen Canon

25

Waktu kompilasi yang lama bisa mengganggu. Dengan C ++ Anda dapat memiliki waktu kompilasi yang sangat lama (yang berarti, tentu saja, lebih banyak waktu untuk Stack Overflow!).


Mengapa ini ditolak? Saya melakukan banyak pekerjaan di C ++ sendiri dan saya tidak akan kembali ke C, tapi itu memang bisa memiliki waktu kompilasi yang sangat panjang (pikirkan tentang templat, misalnya).
Frank

6
Saya menggunakan C ++ untuk pekerjaan nyata, tetapi saya selalu membuat prototipe dalam C karena waktu kompilasi yang hampir instan.
Tom

Hmm, ketika dilakukan dengan cara yang benar, yaitu tidak membengkak kita-mungkin-perlu-ini-termasuk # dan tidak-yakin-mana-yang-benar-termasuk-jadi-i-akan-sertakan-semuanya-# termasuk waktu kompilasi yang rapi. Ketika saya meretas satu atau tiga file, saya hanya perlu 1-2 detik untuk mengkompilasi 100 proyek KLOC saya.
Sebastian Mach

4
@ Tom: Saya ingin tahu seperti apa pekerjaan Anda sebenarnya C ++, jika Anda bisa membuat prototipe dalam C. Apakah Anda tidak menggunakan kemampuan C ++? Bisakah Anda menguraikan?
Sebastian Mach

24

Saya terbiasa menggunakan C ++ untuk proyek saya. Lalu saya mendapat pekerjaan di mana plain C digunakan (kode basis berevolusi 20 tahun dari perangkat lunak AV dengan dokumentasi yang buruk ...).

3 hal yang saya sukai di C adalah:

  • Tidak ada yang tersirat: Anda melihat apa yang tepatnya atau tidak program Anda lakukan. Ini membuat proses debug lebih mudah.

  • Kurangnya ruang nama dan kelebihan dapat menjadi keuntungan: jika Anda ingin tahu di mana fungsi tertentu dipanggil, cukup ambil melalui direktori kode sumber dan itu akan memberi tahu Anda. Tidak diperlukan alat khusus lainnya.

  • Saya menemukan kembali kekuatan pointer fungsi. Pada dasarnya mereka memungkinkan Anda untuk melakukan semua hal polimorfik yang Anda lakukan di C ++, tetapi bahkan lebih fleksibel.


8
+1 Namun polimorfisme seperti itu dalam C biasanya diperoleh melalui void *, yang berbahaya karena menonaktifkan kemampuan kompiler untuk memeriksa apakah Anda melakukan sesuatu yang jahat.
gd1

4
@ gd1 Dalam praktiknya saya tidak dapat mengingat satu kasus pun ketika ini void*menyebabkan masalah. Ada banyak teknik pemrograman defensif untuk melindungi dari kesalahan: menempatkan menegaskan di mana-mana, menambahkan angka ajaib ke struct Anda (dalam build debug), dll. Tetapi sekarang kita memiliki valgrind, dr. memori, dan bahkan MSVC instrumen kode untuk mendeteksi masalah, sehingga masalah kerusakan memori sangat mudah untuk diselesaikan.
Calmarius

4
Saya hampir tidak pernah mengalami kerusakan memori dalam program saya, tetapi jika mungkin saya lebih suka kesalahan terdeteksi sebelum menjalankan program. Casting void*untuk whatever*sesuatu compiler menerima itikad baik. Saya lebih suka kompiler saya tidak mempercayai saya dan memiliki kemungkinan untuk menegakkan pemeriksaan tipe yang kuat. Kesalahan subtitusi templat yang dikeluarkan oleh kompiler C ++ sulit dibaca tetapi setidaknya sampah tidak dikompilasi.
gd1

1
@ gd1 Kembali ke komentar pertama Anda, saya tidak tahu berapa banyak pengalaman yang Anda miliki dengan teknik prosedural (saya melihat Anda aktif di sebagian besar tag OO). The void*biasanya dapat dihindari. Pola khas saat menambahkan perilaku khusus adalah melewati pointer fungsi dan void*untuk data pengguna. Antarmuka umum biasanya terlihat seperti ini. Kemudian perpustakaan ketika meneruskan ini void*kembali ke panggilan balik Anda tanpa melakukan hal lain dengannya. Paling sering Anda tidak memiliki data tambahan, sehingga Anda meneruskan NULL, dan mengabaikan parameter pengguna di panggilan balik Anda. Saya kira Anda tahu ini.
Calmarius

@Calmarius "Paling sering Anda tidak memiliki data tambahan" -> Ini sebenarnya keuntungan dari polimorfisme. Sangat mudah untuk mengikat data tambahan, tanpa menggunakan void pointer. Jadi, alasan Anda pada dasarnya adalah "Saya tidak benar-benar menggunakan fitur itu."
user2445507

15

Saya terkejut tidak ada perpustakaan yang disebutkan. Banyak bahasa dapat terhubung dengan C libs dan memanggil fungsi C (termasuk C ++ dengan extern "C"). C ++ adalah satu-satunya hal yang dapat menggunakan lib C ++ (didefinisikan sebagai 'lib yang menggunakan fitur-fitur dalam C ++ yang tidak ada dalam C [seperti fungsi yang berlebihan, metode virtual, operator yang kelebihan beban, ...], dan tidak mengekspor semuanya melalui antarmuka yang kompatibel C melalui extern "C" ').


1
Tidak begitu; Anda dapat extern "C" atau __cdecl fungsi Anda untuk mengekspos mereka untuk C.
Crashworks

Bagus, tapi bahasa apa yang bisa digunakan?
BigSandwich

2
a C lib dapat bekerja di lebih banyak tempat.
BigSandwich

1
Semua yang dapat terhubung ke C.
Crashworks

2
Alasan yang paling jelas untuk masalah interoperabilitas adalah nama-mangling, dan saya pikir itu layak untuk diangkat.
Tom

15

Jika Anda ingin kode Anda dipahami oleh hampir semua programmer menulis dalam C.


12

Karena mereka ingin menggunakan fitur dalam C99 yang tidak memiliki padanan dalam C ++.


Namun, tidak ada banyak fitur C99 yang berguna untuk C ++ seperti yang dipikirkan orang pada pandangan pertama. Array panjang variabel? C ++ memiliki std :: vektor. Dukungan untuk bilangan kompleks / imajiner? C ++ memiliki tipe templated complex. Fungsi matematika tipe-generik? C ++ kelebihan fungsi matematika standar, menyebabkan hasil yang sama.

Inisialisasi bernama? Tidak di C ++, tapi ada solusinya:

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) { }
    ...
};

Ini memungkinkan Anda untuk menulis hal-hal seperti:

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

Dengar dengar! Kurangnya nama penginisialisasi yang ditunjuk dalam C ++ mendorong saya ke dinding setiap kali saya harus menggunakannya.
ephemient

2
Saya dengan 100% di inisialisasi !!!
Hakim Maygarden

Jika Anda ingin menginisialisasi struktur global di luar fungsi (sehingga Anda tidak dapat .set _ * ()), C ++ memaksa Anda untuk menggunakan sintaks initilizer yang tidak disebutkan namanya, atau menulis konstruktor untuk struct Anda. Saya tidak suka salah satu dari opsi itu.
ephemient

Ada juga VLA di C99 (GCC) yang jauh lebih mudah digunakan std:vector.
Vahid Amiri

10

Karena untuk banyak tugas pemrograman C lebih sederhana, dan cukup baik. Ketika saya memprogram utilitas ringan khususnya, saya bisa merasa seperti C ++ ingin saya membangun supersruktur yang elegan untuk kepentingannya sendiri, daripada hanya menulis kode.

OTOH, untuk proyek-proyek yang lebih kompleks, keanggunan memberikan kekakuan struktural padat yang lebih baik daripada yang alami mengalir keluar dari keyboard saya.


8

Sebagian besar fitur signifikan c ++ entah bagaimana melibatkan kelas atau templat. Ini adalah fitur yang luar biasa kecuali cara kompiler mengubahnya menjadi kode objek. Kebanyakan kompiler menggunakan nama mangling, dan yang tidak melakukan sesuatu setidaknya berantakan.

Jika sistem Anda hidup sendiri, seperti halnya dengan banyak aplikasi, maka C ++ adalah pilihan yang baik.

Jika sistem Anda perlu berinteraksi dengan perangkat lunak yang tidak perlu ditulis dalam C ++ (paling sering di assembler, atau Fortran Libraries) maka Anda berada di tempat yang sempit. Untuk berinteraksi dengan kasus-kasus seperti itu, Anda harus menonaktifkan pembuatan nama untuk simbol-simbol tersebut. ini biasanya dilakukan dengan mendeklarasikan objek-objek itu extern "C", tetapi kemudian mereka tidak bisa menjadi templat, fungsi yang berlebihan, atau kelas. Jika itu kemungkinan merupakan API aplikasi Anda, maka Anda harus membungkusnya dengan fungsi pembantu, dan menjaga fungsi-fungsi tersebut tetap sinkron dengan implementasi yang sebenarnya.

Dan pada kenyataannya, bahasa C ++ menyediakan sintaks standar untuk fitur yang dapat dengan mudah diimplementasikan dalam C. murni

Singkatnya, overhead C ++ yang dapat dioperasi terlalu tinggi untuk dibenarkan oleh kebanyakan orang.


3
Saya sangat terkejut mendengar ini karena saya telah menulis begitu banyak. DLL di C ++ yang memiliki antarmuka "C" dari luar sehingga mereka dapat dipanggil dari C atau bahasa CLR lainnya. Tentu saja Anda tidak bisa hanya mengekspos pointer fungsi anggota, tapi itu benar-benar tidak banyak masalah data marshal untuk panggilan __cdecl.
Crashworks

1
Sebenarnya, Anda dapat mengekspor kode templated. Itu hanya membutuhkan pembungkus fungsi yang tidak templated untuk setiap jenis yang ingin Anda gunakan untuk menghindari tabrakan nama.
Hakim Maygarden

8

Ini cukup dangkal tetapi sebagai siswa yang sibuk saya memilih C karena saya pikir C ++ akan terlalu lama untuk dipelajari. Banyak profesor di universitas saya tidak akan menerima tugas dengan Python dan saya perlu mengambil sesuatu dengan cepat.


8
Bijaksana dari gurumu!
Andrei Ciobanu

6

Satu komentar tentang "cukup gunakan himpunan bagian dari C ++ yang ingin Anda gunakan": masalah dengan ide ini adalah bahwa ia memiliki biaya untuk menegakkan bahwa setiap orang dalam proyek menggunakan himpunan bagian yang sama. Pendapat saya sendiri adalah bahwa biaya-biaya tersebut cukup tinggi untuk proyek yang digabungkan secara longgar (mis. Yang open source), dan juga bahwa C ++ benar-benar gagal menjadi C yang lebih baik, dalam arti bahwa Anda tidak dapat menggunakan C ++ di mana pun Anda menggunakan C.


6

Ya ampun, C vs C ++, cara yang bagus untuk memulai perang api. :)

Saya pikir C lebih baik untuk driver dan kode tertanam.

C ++ memiliki beberapa fitur hebat yang tidak dimiliki C, tetapi banyak fitur berorientasi objek dari C ++ dapat menyebabkan kekacauan pengkodean yang monumental ketika orang menulis kode dengan efek samping yang tidak jelas yang terjadi di balik layar. Kode gila dapat disembunyikan di konstruktor, destruktor, fungsi virtual, ... Keindahan kode C adalah bahasanya tidak melakukan sesuatu yang tidak jelas di belakang Anda, sehingga Anda dapat membaca kode dan tidak harus melihat setiap konstruktor dan destruktor dan seterusnya. Banyak masalah adalah praktik pengkodean yang buruk oleh BEBERAPA orang.

Bahasa saya yang sempurna adalah kombinasi C99 ditambah subset minimal kemampuan C ++ yang lebih aman yang menambahkan ZERO (atau hampir nol) overhead kompiler ke output biner. Penambahan sempurna akan menjadi enkapsulasi kelas dan konsep penamaan data dan fungsi.


Beri nama C + atau C100: _)
m3nda

4

Saya belum dapat menemukan banyak bukti mengapa Anda ingin memilih C daripada C ++.

Anda tidak bisa menyebut apa yang akan saya katakan sebagai bukti; itu hanya pendapat saya.

Orang menyukai C karena cocok dengan baik di dalam pikiran prgrammer.

Ada banyak aturan kompleks C ++ [kapan Anda membutuhkan destruktor virtual, kapan Anda bisa memanggil metode virtual dalam konstruktor, bagaimana cara overload dan overriding berinteraksi, ...], dan untuk menguasainya semua membutuhkan banyak upaya. Selain itu, di antara referensi, overloading operator dan overloading fungsi, memahami sepotong kode dapat mengharuskan Anda untuk memahami kode lain yang mungkin atau mungkin tidak mudah ditemukan.

Pertanyaan berbeda mengapa organisasi lebih memilih C daripada C ++. Saya tidak tahu itu, saya hanya manusia ;-)

Dalam pertahanan C ++, itu memang membawa fitur berharga ke meja; yang saya nilai paling mungkin adalah parametrik ('ish) polimorfisme, meskipun: operasi dan tipe yang mengambil satu atau lebih tipe sebagai argumen.


2
++score: Pernyataan Anda “Orang-orang seperti C karena cocok dengan baik di dalam pikiran programmer” adalah pernyataan yang sangat bagus. Mampu memprogram dalam bahasa sederhana di mana Anda tahu bahwa apa yang Anda lihat adalah apa yang Anda dapatkan adalah properti yang benar-benar menarik untuk bahasa pemrograman.
tchrist

3

Saya akan mengatakan bahwa C memberi Anda kontrol yang lebih baik atas optimasi dan efisiensi daripada C ++ dan karenanya akan berguna dalam situasi di mana memori dan sumber daya lainnya terbatas dan setiap optimasi membantu. Ini juga memiliki tapak yang lebih kecil tentu saja.


Bisakah Anda memberi contohnya?
Andrew Grant

Jadi kode C yang sama dikompilasi menggunakan kompiler C akan lebih efisien jika dikompilasi menggunakan kompiler C ++?
Steve Kuo

1
Bertahun-tahun yang lalu kernel Linux dapat dikompilasi dengan gcc atau g ++, tetapi g ++ membuat kode lebih lambat ( tux.org/lkml/#s15-3 di bawah "Akhirnya, sementara Linus mempertahankan kernel pengembangan ...").
Max Lybbert

Saya kira saya berpikir lebih dalam garis untuk dapat mengontrol lebih banyak tentang bagaimana kode Anda dioptimalkan dalam C lebih dari C ++. Sama seperti bagaimana seorang programmer yang menggunakan bahasa rakitan dapat memperbaiki kodenya lebih tepat daripada yang menggunakan bahasa tingkat lebih tinggi.
Chris

2

Ada juga pendekatan yang dilakukan beberapa toko dengan menggunakan beberapa fitur C ++ dengan cara yang mirip C, tetapi menghindari yang tidak pantas. Sebagai contoh, menggunakan kelas dan metode kelas dan fungsi overloading (yang biasanya mudah bahkan diehard C untuk mengatasinya), tetapi tidak STL, operator streaming, dan Peningkatan (yang lebih sulit untuk dipelajari dan dapat memiliki karakteristik memori buruk).


1

Karena Anda menulis untuk sistem yang sumber dayanya sangat ketat (seperti sistem yang disematkan, atau semacam kode bare metal seperti kernel) dan Anda ingin sesedikit mungkin biaya overhead.

Ada alasan mengapa sebagian besar sistem embedded tidak memiliki kompiler C ++ - bukan karena orang tidak menginginkannya, melainkan menjejalkan kode C ++ ke dalam ruang kecil itu adalah tugas yang mendekati mustahil.


3
Tidak terlalu banyak masalah C ++ itu sendiri sebagai bahasa, tetapi mengasapi patologis bahwa penggunaan sembarang template dapat menyebabkan.
Crashworks

1
ecos sebagian besar ditulis dalam C ++. Tidak ada hubungan antara bahasa (dibandingkan dengan C) dan ukuran yang dapat dieksekusi (selama Anda tahu fitur apa yang digunakan).
user52875

1
"Selama Anda tahu fitur apa yang digunakan". Itulah intinya - hasil dari mengatakan "baik, kami memiliki C ++, tetapi kami tidak dapat mendukung setengah fitur bahasa karena alasan overhead" adalah Symbian / C ++, yang membingungkan dan membuat marah baik programmer C dan programmer C ++ ...
Steve Jessop

1
Menyetujui semua poin. Solusi kami untuk "mengetahui fitur apa yang harus digunakan" adalah dengan hanya menggunakan kompiler C dan menyebutnya sehari. Tentu, kami bisa membuat C ++ berfungsi, (yang akan sangat menyenangkan dengan cara yang agak aneh) tetapi kami memiliki produk untuk dikirim, dan tidak punya waktu untuk mengkhawatirkannya.
Electrons_Ahoy

1

Yang dibutuhkan C adalah preprosesor yang lebih baik. cfront adalah satu dan karenanya lahir c ++

Saya akan menggunakan C, di mana 'c ++ sebagai preprocessor' tidak akan apa-apa.

Saya cukup yakin, di bagian bawah c ++ library / framework / toolkit yang ditulis dengan baik, Anda akan menemukan dirty-old-c (atau gips statis, yang sama)


0
  • Sampai beberapa tahun yang lalu, kompiler C ++ yang ada kehilangan fitur-fitur penting, atau dukungannya buruk dan fitur yang didukung sangat bervariasi di antara mereka, sehingga sulit untuk menulis aplikasi portabel.
  • Karena tidak ada standar penamaan simbol, sulit bagi bahasa / aplikasi lain untuk mendukung kelas C ++ secara langsung.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.