Saya sedang mengembangkan emulator NES sebagai hobi, di waktu senggang saya. Saya menggunakan C ++ karena bahasa yang saya gunakan kebanyakan, tahu sebagian besar dan suka kebanyakan.
Tapi sekarang saya membuat beberapa kemajuan dalam proyek saya menyadari saya tidak menggunakan hampir semua fitur spesifik C ++, dan bisa melakukannya di C polos dan mendapatkan hasil yang sama. Saya tidak menggunakan templat, kelebihan operator, polimorfisme, pewarisan. Jadi, apa yang akan Anda katakan? saya harus tetap di C ++ atau menulis ulang di C?
Saya tidak akan melakukan ini untuk mendapatkan kinerja, itu bisa datang sebagai efek samping, tetapi idenya adalah mengapa saya harus menggunakan C ++ jika saya tidak membutuhkannya?
Satu-satunya fitur C ++ yang saya gunakan adalah kelas untuk merangkum data dan metode, tetapi itu bisa dilakukan juga dengan struct dan fungsi, saya menggunakan baru dan menghapus, tetapi bisa juga menggunakan malloc dan gratis, dan saya menggunakan warisan hanya untuk panggilan balik, yang bisa dicapai dengan pointer ke fungsi.
Ingat, ini adalah proyek hobi, saya tidak punya tenggat waktu, jadi waktu overhead dan pekerjaan yang memerlukan penulisan ulang tidak masalah, mungkin menyenangkan juga. Jadi, pertanyaannya adalah C atau C ++?
I use C++ because is the language I use mostly, know mostly and like mostly.
Dan itulah jawaban untuk pertanyaan Anda. Anda seharusnya hanya beralih bahasa di tengah proyek ketika ada masalah yang tidak dapat diselesaikan oleh bahasa Anda saat ini.I don't use templates, operator overloading, polymorphism, inheritance.
Akan jauh lebih berharga untuk belajar dan menggunakan konsep, daripada beralih ke C. Karena ini adalah proyek hobi, mengapa tidak menggunakan beberapa hal yang belum pernah Anda gunakan sebelumnya? Anda selalu dapat memulai proyek lain dalam C dan mempelajari bahasa, tetapi untuk proyek Anda saat ini, tidak masuk akal untuk beralih.std::shared_ptr
,std::unique_ptr
,boost::scoped_ptr
,std::vector
,std::deque
,std::map
, dll Untuk fungsi callback, melihat ke dalam penggunaan functors, dan di C ++ 11, Anda dapat juga mulai menggunakan hal-hal seperti fungsi lambda.Jawaban:
Anda tidak menggunakannya sekarang, tetapi pada saat Anda membocorkan memori atau mendapatkan penghapusan ganda, Anda akan memohon untuk kembali
std::vector<T>
,std::unique_ptr<T, Del>
danstd::shared_ptr<T>
, yang dapat memecahkan masalah itu dengan mudah - hampir sepele. Itulah yang terjadi pada semua orang yang menggunakan C lebih dari C ++, pada akhirnya, dan yang lebih pintar tidak menunggu bug muncul sebelum pindah.Kode yang menggunakan
new
dandelete
secara langsung tidak benar-benar termasuk dalam C ++, itu termasuk dalam semacam setengah rumah yang kita sebut sebagai "C dengan Kelas". Di situlah bahasa itu sekitar tahun 1985. Ini tidak terlalu mirip dengan C ++, sekitar tahun 2011. Kemungkinan besar, di mana pun Anda belajar C ++ tidak mengajarkannya dengan sangat baik - sesuatu yang sayangnya agak umum - dan dengan pendidikan yang lebih baik, Anda harus temukan penggunaan fitur-fitur ini.Secara khusus, seperti yang saya sebutkan di atas, struktur data generik C ++ dan kelas-kelas pengelola sumber daya secara mendasar jauh lebih unggul daripada apa pun yang ditawarkan C. Jika Anda menginginkan array yang dialokasikan secara dinamis, gunakan
std::vector<T>
. Itu kasus penggunaan yang cukup umum. Jika Anda tidak menggunakannya, maka kode Anda beresiko besar mengalami kesalahan yang tidak perlu - terutama terkait pengelolaan sumber daya. C ++ dapat menjamin keamanan dan penggunaan kembali kode dengan cara yang tidak pernah dapat disentuh C.Namun, saya pikir Anda juga mungkin berharap terlalu banyak. Templat penulisan dan kelebihan operator tidak umum bagi konsumen perpustakaan. Jika kode Anda digunakan
std::vector<T>
, Anda tidak perlu menulis templat untuk mewujudkannya. Jika kode Anda digunakanstd::string
, tidak ada yang memaksa Anda untuk membebani operator Anda. Anda hanya perlu melakukan hal-hal itu untuk menulisstd::vector<T>
danstd::string
- tetapi Anda masih dapat memanfaatkannya sepenuhnya.Polimorfisme / warisan juga hanya memiliki kasus penggunaan khusus. Jika kode Anda tidak mengharuskan Anda untuk menulis templat apa pun atau menggunakan fungsi virtual, maka tidak, dan ada program atau segmen program di mana Anda tidak perlu menulis templat Anda sendiri.
Juga, tidak ada keuntungan dalam kinerja di C lebih dari C ++.
sumber
make_shared
ada, dan Anda dapat menulismake_unique
templat sepele yang melakukan pekerjaan yang sama. Lebih aman.make_shared
lebih efisien. Hanya fungsi pabrik yang dapat menawarkan keamanan pengecualian yang dijamin.Bahkan jika Anda tidak menggunakan fitur khusus C ++, kompiler C ++ akan menangkap lebih banyak masalah daripada yang C karena sistem tipe yang lebih ketat dari C ++.
sumber
Saya akan melihatnya dari arah lain. Apakah Anda mendapatkan sesuatu dengan menulis ulang kode dalam C? Bahkan pada proyek murni penghobi, ada biaya yang terkait dengan penulisan ulang seperti itu. Jika tidak ada lagi yang saya kira akan disebut biaya peluang - yaitu, hal-hal lain yang dapat Anda lakukan pada saat itu jika Anda tidak
membuang waktu untukmenulis ulang dalam C.Intinya: kecuali jika Anda berpikir kode tersebut benar-benar mungkin digunakan di beberapa lingkungan di mana akses ke C ++ benar-benar terbatas (atau tidak ada), itu akan menjadi pemborosan waktu yang sia-sia pada waktu terbaik. Setidaknya dalam pengalaman saya, biasanya melampaui yang sangat cepat - memikirkan kembali kode yang telah saya tulis dalam C ++ yang harus dikonversi ke C, saya dapat dengan jelas mengingat bahwa bahkan dalam beberapa kasus di mana sepertinya seharusnya sepele, saya menggunakan lebih banyak fitur khusus untuk C ++ daripada yang saya sadari. Untuk memiliki banyak harapan berguna sama sekali, Anda harus menargetkan C89 / 90, dalam hal ini Anda dengan cepat diingatkan tentang hal-hal seperti harus mendefinisikan semua variabel di awal blok bukannya di mana mereka sebenarnya bekas.
Singkatnya, kecuali Anda cukup yakin menulis ulang dalam C akan memberikan manfaat nyata, hampir pasti ada banyak hal yang lebih baik untuk dilakukan.
sumber
Sebagai jawaban yang lebih umum:
Jangan beralih ke C ++ hanya karena Anda menggunakan beberapa fitur yang lebih unik. Suatu hari Anda mungkin memerlukan fitur-fitur itu, dan hanya akan menumbuk kepala Anda karena Anda menggunakan C.
sumber
Untuk pengembangan hobi, saya akan mempertimbangkan beralih kembali ke bahasa C.C dan C-like lebih cenderung didukung pada modul pengembangan hobi kecil.
Banyak jawaban di sini mungkin dari jenis perangkat lunak profesional. Sebagai seorang penghobi, Anda tidak akan dapat mengkode secara terus-menerus atau penuh waktu. Jadi pertimbangkan bahasa mana yang lebih Anda ingat atau lupakan quirks di dalamnya, jika Anda membuat tabel proyek Anda selama satu tahun dan kemudian kembali dan mencoba membaca kode Anda setelah Anda berkarat dalam pengkodean. C ++, memiliki set fitur yang lebih kaya, mungkin membutuhkan waktu lebih atau kurang untuk memperoleh kembali, tergantung pada gaya pengkodean Anda.
sumber
Tidak mudah untuk menjawab pertanyaan Anda, karena kami tidak tahu apakah Anda sedang mengerjakan proyek untuk meningkatkan keterampilan spesifik bahasa Anda (C vs C ++) atau untuk meningkatkan keterampilan pemrograman lainnya (desain, pemecahan masalah, dll.).
"Satu-satunya fitur C ++ yang saya gunakan adalah kelas untuk merangkum data dan metode, tetapi itu dapat dilakukan juga dengan struct dan fungsi,". Ini tidak benar.
structs
di C tidak mendukung enkapsulasi dan tidak dapat berisi fungsi (metode) - setidaknya tidak tanpa menggunakan teknik seperti pointer ke fungsi. Juga, fungsi dalam C lebih lemah karena mereka tidak dapat kelebihan beban."Saya menggunakan baru dan menghapus, tetapi bisa juga menggunakan malloc dan gratis, dan saya menggunakan warisan hanya untuk panggilan balik, yang dapat dicapai dengan pointer ke fungsi." Seperti deadmg yang disebutkan, menggunakan secara langsung
new
dandelete
dalam C ++ tidak dianjurkan. Juga, warisan IMHO (dan GoF) dalam OOP harus lebih disukai daripada komposisi hanya ketika polimorfisme diperlukan. Dan saya tidak berpikir bahwa itu sepele untuk mencapai polimorfisme (pengikatan lanjut) dalam C menggunakan pointer ke fungsi.Selain itu, saya tidak akan mencoba meyakinkan Anda bahwa C ++ "lebih baik" daripada C karena itu masalah preferensi dan selalu tergantung pada masalah yang Anda coba selesaikan (menggunakan fitur OOP untuk mengembangkan emulator NES Anda mungkin sebuah ide bagus).
sumber
structs
dalam C dapat, pada kenyataannya, digunakan untuk merangkum metode. Anda cukup membuat struct pointer fungsi, dan menginisialisasi mereka untuk menunjuk ke fungsi mana pun yang Anda inginkan. Lihatlah lxr.linux.no/linux+v3.3/include/linux/fs.h#L1598 untuk contoh.printf
), tetapi dengan melakukan itu Anda kehilangan semua pemeriksaan jenis. Tidak ada cara untuk memiliki deklarasi terbatas yang dapat diterima: itu adalah 1 (dan Anda mendapatkan pengecekan tipe) atau "banyak" (dan kehilangan semua pengecekan tipe, dengan risiko pribadi yang besar). Seperti kebanyakan hal dalam C, itu mungkin tetapi seringkali tidak nyaman.Saya seorang pemula, jadi inilah 2 bit saya.
Saya belajar C dan C ++ di Wibit.net dengan beberapa videotutorial dasar yang bagus, mungkin mereka dapat banyak membantu Anda untuk mengambil gambaran tentang "situasi" (bukan iklan!)
Saya menyarankan Anda untuk beralih ke C, hanya untuk belajar, karena Anda seorang hobi, ini akan menyenangkan, bukan masalah.
Saya menyarankan lebih banyak. Lakukan dalam kedua bahasa. Bandingkan cara dan solusi yang akan Anda temukan dan gunakan. Saya yakin itu tidak akan "semudah" seperti yang Anda harapkan ... tetapi Anda pasti akan belajar banyak!
sumber
Inilah pro dan kontra dari C ++ vs. C:
sumber