Neden kimse C ++ yerine C kullanır? [kapalı]


132

İnsanlar C ++ hakkında şikayette bulunmaktan hoşlanıyor gibi görünseler de , C ++ yerine C'yi neden seçmek isteyeceğinize dair çok fazla kanıt bulamadım. C, neredeyse hiç sorun yaşamıyor gibi görünüyor ve eğer C ++ tüm bu sorunları yaşıyorsa, neden kendinizi C alt kümesiyle sınırlayamıyorsunuz? Düşünceleriniz / deneyimleriniz nelerdir?


birebir yinelenen bağlantı artık çalışmıyor ..... c partisine geç kalan adam diyor :)
kyle

4
C, C ++ 'dan gerçekten daha iyi ve daha basittir, ancak herhangi bir C programcısı C ++' yı C'ye dönüştürebilir ve güler.
BobRun

11
Korkunç olan şey, genel olarak insanların "++" nın gerçekten çok iyi olduğu anlamına geldiğini düşünmesidir, üzgünüm öyle değil.
BobRun

Açık olan - küçük / gömülü cihazların dışında - genellikle C, OOP özelliklerinin bir şişkinlik olduğu saf sayı hesaplama problemleri için (örneğin, GPU grafik işleme, büyük ölçüde paralel fizik hesaplamaları, model madenciliği vb.) Daha iyidir. C ++, 'nesnelerin' etkileşime girdiği sistemlerin modellemesi için daha iyidir, OOP yetenekleriyle çok daha kolaydır.
paceman

3
Çünkü JavaScript, en iyi uygulamalar, c ++ ve OOP, muhtemelen gerçekten var olmayan veya çözülmesi gereken bu soyut sorunları çözmek için aptalca / çok meşguller.
mareşal aracı

Yanıtlar:


132

Joel'in cevabı sen olabilir nedenlerle iyidir sahip birkaç başka olmasına rağmen, C kullanmak:

  • C'de kanıtlanması ve test edilmesi daha kolay olan endüstri yönergelerini karşılamalısınız.
  • C ile çalışmak için araçlara sahipsiniz, ancak C ++ 'yı değil (yalnızca derleyiciyi değil, tüm destek araçlarını, kapsamı, analizi vb. Düşünün)
  • Hedef geliştiricileriniz C uzmanlarıdır
  • Sürücüler, çekirdekler veya diğer düşük seviyeli kodlar yazıyorsunuz
  • C ++ derleyicisinin, yazmanız gereken kod türünü optimize etmede iyi olmadığını biliyorsunuz
  • Uygulamanız yalnızca nesne odaklı olmakla kalmaz, aynı zamanda bu biçimde yazmak da daha zor olur

Yine de bazı durumlarda, C ++ yerine C kullanmak isteyebilirsiniz :

  • Assembler'da kodlama sıkıntısı olmadan assembler performansını istiyorsunuz (C ++ teorik olarak 'mükemmel' performansa sahiptir, ancak derleyiciler iyi bir C programcısının göreceği optimizasyonları görme konusunda o kadar iyi değildir)
  • Yazdığınız yazılım önemsiz ya da neredeyse öyledir - minik C derleyicisini çıkarın, birkaç satır kod yazın, derleyin ve hazırsınız - yardımcılarla birlikte büyük bir düzenleyici açmanıza gerek yok, pratik olarak yazmaya gerek yok boş ve yararsız sınıflar, ad alanlarıyla ilgilenin, vb. Bir C ++ derleyicisiyle hemen hemen aynı şeyi yapabilir ve sadece C alt kümesini kullanabilirsiniz, ancak C ++ derleyicisi küçük programlar için bile daha yavaştır.
  • Aşırı performansa veya küçük kod boyutuna ihtiyacınız var ve C ++ derleyicisinin kitaplıkların boyutu ve performansı nedeniyle başarmayı gerçekten zorlaştıracağını biliyorsunuz

Sadece C alt kümesini kullanabileceğinizi ve bir C ++ derleyicisi ile derleyebileceğinizi iddia ediyorsunuz, ancak bunu yaparsanız derleyiciye bağlı olarak biraz farklı sonuçlar alacağınızı göreceksiniz.

Ne olursa olsun, bunu yapıyorsanız, C kullanıyorsunuz. Sorunuz gerçekten "C programcıları neden C ++ derleyicileri kullanmıyor?" Eğer öyleyse, o zaman ya dil farklılıklarını anlamıyorsun ya da derleyici teorisini anlamıyorsun.


2
Ayrıca AFAIK'in henüz C ++ için gerçekten kararlı olmadığı MISRA C standardı da var.
Paul Nathan

60
Performans kısmı mutlaka doğru değildir. C ++ 'nın C'den çok daha iyi optimize edebileceği pek çok alan vardır (Elbette bunun tersi de bazen doğrudur, ancak genellikle performans nedenleriyle C ++ yerine C'yi seçmek kötü bir fikirdir).
jalf

9
Daha fazla performans bilgisi ilgimi çeker. C'nin neden yalnızca "ara sıra" daha iyi performans gösterdiğini anlamıyorum. Ortalama bir programcı verildiğinde, C ++ performansı elde etmeyi kolaylaştırabilir (kalıpların iyi kullanımı), ancak bir uzman tarafından yazılan bir C programı daha hızlı olmalıdır - daha düşük ek yük.
Adam Davis

3
Elbette, daha hızlı C programının yazılması ve hata ayıklaması daha uzun sürer, bu yüzden bir değiş tokuş vardır ve makinelerin hızı göz önüne alındığında, özel uygulamalar dışında bu takas buna nadiren değecektir, bu yüzden C ++ genellikle daha iyidir. (kod tamamlandığında, bilgisayarlar daha hızlı olur ve dif'i yer)
Adam Davis

21
@Adam: C ++, "güzel" kodla C'den daha iyi performans gösteriyor. C ++, C'nin bir makroya ihtiyaç duyduğu durumlarda şablonları ve satır içi işlevleri kullanabilir. C ++ ek yükü yalnızca istendiğinde görünür, aksi takdirde C ile aynıdır (sanal, dene / fırlat, dinamik yayın). Ek yükün çoğu yalnızca program görüntü boyutunda gösterilir.
Zan Lynx

88

Minimalizmi ve sadeliği seviyorum.


9
Tamam - yeterince adil ... öyleyse neden Forth olmasın?
Jonathan Leffler

14
Sanırım ayrıca kütüphaneler, kitaplar, forumlar bulundurmayı seviyor?
gnud

30
Cevabınızın minimalizmini ve basitliğini beğendim ... :)
Joe DF

8
Katılıyorum. C çok basit ve "küçük". C her zaman aynı görünür ve bir projeye yeni bir katkıda bulunuyorsanız, nasıl çalıştığını anlamak kolaydır. c ++ 'nın pek çok yararsız şeyi var ve bir c ++ projesine baktığımda kafam hemen karışıyor. C ++ insanlarını (OO yetenekleri olan bir C dili) anlayabiliyorum ama C sadece daha basit ve kolaydır.
user69969

1
Ayrıca, küçük evrensel kitaplıklar, komut dosyası dilleri ve evet, işleme motorları gibi bazı tür kitaplıkları yazmak için C'nin çok daha uygun bir dil olduğunu düşünüyorum.
keebus

65
  • Çünkü zaten C'yi biliyorlar
  • Çünkü sadece C derleyicisine sahip bir platform için gömülü bir uygulama geliştiriyorlar
  • C ile yazılmış eski yazılımları korudukları için
  • Bir işletim sistemi, ilişkisel veritabanı motoru veya perakende bir 3B video oyun motoru düzeyinde bir şeyler yazıyorsunuz.

4
Bazı mikrodenetleyicilerin yalnızca gerçekten berbat olan C derleyicileri vardır. Temel C ++ özellikleri (ad alanları, sanal işlevlerin yanı sıra sınıflar, numaralandırmalar, bloğun üst kısmının yanı sıra başka yerlerde değişkenleri bildirme) en değerli olan IMHO'dur.
Jason S

2
Bundan, yalnızca makul alternatifler yoksa C'yi seçeceğiniz anlaşılıyor.

2
@ Joe: İlk noktanın yanı sıra, bu onu özetliyor. Sonraki dillerin çoğu C'yi aldı ve "hey, daha iyisini yapabiliriz" dedi .
Joel Coehoorn

1
Kabul. Sofistike C ++ özelliklerini kullanmıyorsanız, C ++ 'nın tekdüze olarak daha iyi bir C olduğuna inanıyorum. Daha karmaşık C ++ özellikleriyle işler daha tartışmalı hale geliyor, ancak o zaman tartışma genellikle daha yüksek bir soyutlama seviyesine karşı - örneğin Java.
Paul Nathan

4
Aslında çoğu 3D oyun motoru C ++ kullanıyor. UE4, çoğunlukla C ++ kullanır.
Aditya Kashi

56

Performans korkusu veya şişkinlik C ++ 'dan vazgeçmek için iyi bir neden değildir. Her dilin kendi potansiyel tuzakları ve değiş tokuşları vardır - iyi programcılar bunları öğrenir ve gerektiğinde başa çıkma stratejileri geliştirir, kötü programcılar çılgına dönecek ve dili suçlayacaktır.

Yorumlanmış Python birçok yönden "yavaş" bir dil olarak kabul edilir, ancak önemsiz olmayan görevler için yetenekli bir Python programcısı, deneyimsiz bir C geliştiricisininkinden daha hızlı çalışan kodu kolayca üretebilir.

Sektörümde, video oyunlarında, iç döngülerde RTTI, istisnalar veya sanal işlevler gibi şeylerden kaçınarak C ++ ile yüksek performanslı kod yazıyoruz. Bunlar son derece yararlı olabilir, ancak kaçınılması gereken performans veya şişkinlik sorunları olabilir. Bir adım daha ileri gidip tamamen C'ye geçersek, çok az kazanacak ve C ++ 'nın en kullanışlı yapılarını kaybedeceğiz.

C'yi tercih etmenin en büyük pratik nedeni, desteğin C ++ 'dan daha yaygın olmasıdır. C ++ derleyicilerine bile sahip olmayan pek çok platform vardır, özellikle gömülü olanlar.

Satıcılar için uyumluluk konusu da var. C kararlı ve iyi tanımlanmış bir ABI'ye (Uygulama İkili Arayüzü) sahipken, C ++ yoktur. C ++ 'daki ABI, vtables ve yapıcılar / yıkıcılar gibi şeyler nedeniyle daha karmaşıktır, bu nedenle her satıcıda ve hatta bir satıcı araç zincirinin sürümlerinde farklı şekilde uygulanır.

Gerçek anlamda bu, bir derleyici tarafından oluşturulan bir kitaplığı alıp onu kodla veya diğerinden bir kitaplıkla bağlayamayacağınız anlamına gelir; bu, dağıtılmış projeler veya ikili kitaplıkların ara yazılım sağlayıcıları için bir kabus oluşturur.


7
"Yorumlanmış Python birçok yönden" yavaş "bir dil olarak kabul edilir, ancak önemsiz olmayan görevler için yetenekli bir Python programcısı, deneyimsiz bir C geliştiricisininkinden daha hızlı çalışan kodu kolayca üretebilir." Sanırım algoritma dersleri alan bir programcı (mutlaka bir Python Progammer değil), deneyimsiz bir geliştiricininkinden (genel olarak) daha hızlı çalışan kod üretebilir.
Andrei Ciobanu

15
Ve aynı deneyimsiz c dev, c kodundan daha yavaş bir python kodu üretecektir. Python, c'den çok daha yavaştır.
Millie Smith

37

C ile yazmayı seçiyorum çünkü küçük, sıkı bir dille çalışmaktan zevk alıyorum. Makul bir sürede okunabilen bir standarda erişmeyi seviyorum (benim için - çok yavaş bir okuyucuyum). Ayrıca, birkaç istenen C ++ derleyicisinin ( bazı PIC mikro denetleyicileri gibi) bulunduğu gömülü sistemler için yazılım yazmak için kullanıyorum .


re: PIC'ler - Acınızı hissediyorum. Çok fazla PIC kodu yapmam gerekirse, muhtemelen C ++ 'yı destekleyen IAR derleyicisini kullanacağım. Bunu MSP430'da kullandım ve oldukça hoş.
Jason S

1
Ve C için büyük ölçüde geliştirilmiş derleme sürelerini de unutmayın. Şablon sistemi yok.
Engineer

35

Diğer görüşü ele alıyorum: Neden C yerine C ++ kullanmalı?

The C Programming Language (aka: K&R) kitabı , 300 sayfadan kısa bir sürede dilin yapabildiği her şeyi nasıl yapacağınızı açıkça anlatıyor. Minimalizmin bir şaheseri. Hiçbir C ++ kitabı yanına bile yaklaşmaz.

Bariz karşı argüman, hepsi olmasa da çoğu modern dil için aynı şeyin söylenebileceğidir - ayrıca her şeyi sadece birkaç yüz sayfada nasıl yapacağınızı söyleyemezler. Doğru. Öyleyse neden bunun yerine C ++ kullanalım? Özellik zenginliği? Güç? Daha zengin özellikli veya güçlü bir şeye ihtiyacınız varsa, o zaman C #, Objective C, Java veya bunun gibi başka bir şeyle gidin. Neden kendinizi C ++ 'nın karmaşıklığıyla yüklüyorsunuz? C ++ hibe kontrol derecesine ihtiyacınız varsa, C'yi kullanmayı savunuyorum. C her şeyi yapabilir ve iyi yapabilir.


Katılıyorum. Güç istiyorum, bu yüzden gerçekten güçlü bir şey kullanıyorum, 1/2 yol noktası değil.
Dinah

7
@Dinah: 1/2 yol noktası, C # veya Java'nın performans ve bellek maliyeti olmadan size daha yüksek düzeyde ifade gücü verir.
Zan Lynx

5
@Zan Lynx: haklısın. Ama umarım orijinal yazımda yaptığım muhalif tavrı alarak, C ++ 'ya göre C'nin yaşayabilirliği hakkında bir noktaya değindiğimi umuyorum ... belirttiğiniz gibi, açık ve kapalı bir dava olmasa bile.
Dinah

28

Daha önce bahsedilen diğer birkaç noktaya ek olarak:

Daha az sürpriz

yani, bir kod parçasının tam olarak ne yapacağını görmek çok daha kolaydır . C ++ 'da derleyicinin tam olarak hangi kodu ürettiğini bilmek için guru düzeyine yaklaşmanız gerekir (şablonlar, çoklu kalıtım, otomatik oluşturulan oluşturucular, sanal işlevlerin bir kombinasyonunu deneyin ve biraz ad alanı sihri ve argümana bağlı aramada karıştırın).

Çoğu durumda bu sihir güzeldir, ancak örneğin gerçek zamanlı sistemlerde gününüzü gerçekten berbat edebilir.


27

Linus'un sorunuza cevabı "C ++ korkunç bir dil olduğu için"

Kanıtları en iyi ihtimalle anekdottur, ama bir anlamı var ..

Daha düşük seviyeli bir dil olduğundan, onu C ++ 'ya tercih edersiniz. C ++, ilave kitaplıklar ve ekstra özellikler için derleyici desteği ile C'dir ( her iki dilde de diğer dilin sahip olmadığı özellikler vardır ve her şeyi farklı şekilde uygular ), ancak eğer varsa C ile ilgili zaman ve deneyim, ekstra düşük seviyeli ilgili güçlerden yararlanabilirsiniz ... [Düzenlendi] (çünkü dilin / derleyicinin kendisinden gelen bazı güçlerden yararlanmak yerine manuel olarak daha fazla iş yapmaya alışırsınız )

Bağlantılar eklemek:

Neden gömülü için C ++

Neden hala C kullanıyorsun? PDF

Bunun için Google'ı arardım .. çünkü internette zaten pek çok yorum var


17
C ile çok fazla kodlama yaptım, ardından C ++ 'da kısa bir süre, sonra VB ile utanç verici derecede uzun bir süre ve şimdi son birkaç yıldır C # kullanıyorum. O zamandan beri biraz C ve C ++ kodu yazdım ve C'nin iyi tanımlanmış ve sıkı, C # havalı ve güçlü ve C ++ berbat olduğunu fark ettim.
CMPalmer

25
Linus, C ++ 'nın yararları hakkında konuşmak için gerçekten nitelikli değil. Ondan bir tür kahinmiş gibi alıntı yapmak aptalca. Ve "işleri zor yoldan yapmak" ile ilgili kısım mantıklı değil. C'yi kullanmak için iyi nedenler var ama "daha çok iş var" veya "Linus öyle dedi" aralarında değil.
jalf

8
@jalf, Linus'tan bir tür kahinmiş gibi alıntı yapmadan, dünyada en çok kullanılan programlardan biri olan linux çekirdeğindeki seçimleriyle ilgili bilgili bir programcının fikrinden bahsetmek iyi olur. Soru fikir soruyor (birisi neden C'yi seçsin) cevaplamayı amaçladığım şey.
Ric Tokyo

6
Linus, C ++ hakkındaki görüşler için kötü bir kaynak çünkü kullanmıyor ve bildiğim kadarıyla 1990'da bir kez denedi.
Zan Lynx

3
@Zan Linus başka yerlerde daha fazla öz denetim sergiledi: "C ++ 'ı ve getirdiği ekstra özellikleri kullanmak isterdik, ancak C ++' da kötü kodun nerede olduğunu C'ye göre görmek daha zor". Cevabımdaki alıntı, "lideri takip et" olmaktan ziyade bir görüşün kaydıdır.
Ric Tokyo

26

Çünkü bir eklenti yazıyorlar ve C ++ 'nın standart ABI'si yok.


9
Doğru olmasına rağmen, C'ye bağlı kalmak için ikna edici bir neden değil çünkü gerekli işlevleri C bağlantısını kullanarak dışa aktarabilir ve uygulamanızı yine de C ++ 'da tutabilirsiniz.
codelogic

2
@codelogic - C ++ projeleri, eşdeğer C projelerinden çok daha fazla tür ve işlevi dışa aktarma eğilimindedir. Bunu son bir paylaşılan kitaplıkta saklamak mümkündür, ancak muhtemelen değerinden daha fazla çaba gerektirir.
Tom

tbh gerçekten iyi bir cevap değil ama +1 çünkü C ++ 'da standart ABI yok (evet .. C ++ berbat)
hasen

6
C'nin de standart ABI'si yoktur.
Stephen Canon

25

Uzun derleme süreleri can sıkıcı olabilir. C ++ ile çok uzun derleme sürelerine sahip olabilirsiniz (bu, elbette, Stack Overflow için daha fazla zaman anlamına gelir!).


Bu neden reddedildi? Ben de C ++ 'da çok iş yapıyorum ve C'ye geri dönmem ama gerçekten çok uzun derleme süreleri olabilir (örneğin şablonları düşünün).
Frank

6
Gerçek iş için C ++ kullanıyorum, ancak neredeyse anlık derleme süreleri nedeniyle her zaman C'de prototip oluşturuyorum.
Tom

Hmm, doğru şekilde yapıldığında, yani şişirilmeden, yani bunlara-ihtiyacımız olabilir- # içerir ve emin değil-hangisi-doğru-dahil-dahil-yani-ben-hepsini-içerecek- # derleme zamanlarının düzgün olduğunu içerir. Bir veya üç dosyayı hacklediğimde, 100 KLOC projemi derlemek sadece 1-2 saniyemi alıyor.
Sebastian Mach

4
@Tom: C ++ 'da prototip oluşturabilirseniz, gerçek işiniz C ++ neye benziyor merak ediyorum. C ++' yeteneklerini kullanmıyor musunuz? Detaylandırır mısın
Sebastian Mach

24

Projelerim için C ++ kullanmaya alışkınım. Daha sonra düz C'nin kullanıldığı bir iş buldum (kötü belgelere sahip bir AV yazılımının 20 yıllık gelişen kod tabanı ...).

C'de sevdiğim 3 şey:

  • Hiçbir şey örtük değildir: programınızın tam olarak ne yaptığını veya yapmadığını görürsünüz. Bu, hata ayıklamayı kolaylaştırır.

  • İsim alanlarının ve aşırı yüklenmelerin olmaması bir avantaj olabilir: belirli bir işlevin nerede çağrıldığını bilmek istiyorsanız, sadece kaynak kodu dizininde grep yapın ve size söyleyecektir. Başka özel alet gerekmez.

  • İşlev işaretçilerinin gücünü yeniden keşfettim. Temel olarak C ++ 'da yaptığınız tüm polimorfik şeyleri yapmanıza izin verirler, ancak daha da esnektirler.


8
+1 Bununla birlikte, C'deki bu tür polimorfizm genellikle void * aracılığıyla elde edilir, bu da derleyicinin kötü bir şey yapıp yapmadığınızı kontrol etme yeteneğini devre dışı bıraktığı için tehlikelidir.
gd1

4
@ gd1 Pratikte bu void*sorun çıkardığında tek bir vakayı hatırlayamıyorum . Hatalara karşı korunmak için birçok savunma programlama tekniği vardır: her yere iddialar koymak, yapılarınıza sihirli sayılar eklemek (hata ayıklama yapılarında), vb. Ancak günümüzde valgrind, dr. bellek ve hatta MSVC, sorunları tespit etmek için kodu kullanır, böylece bellek bozulması sorunlarının çözülmesi oldukça kolaydır.
Calmarius

4
Programlarımda neredeyse hiç bellek bozulması yaşamıyorum, ancak mümkünse, programı çalıştırmadan önce hataların tespit edilmesini tercih ederim. Döküm void*için whatever*derleyici iyi niyetle kabul şeydir. Derleyicimin bana güvenmemesini ve sağlam tür denetimleri gerçekleştirme olanağını tercih ederim. C ++ derleyicileri tarafından verilen şablon değiştirme hatalarını okumak zordur, ancak en azından çöpler derlenmez.
gd1

1
@ gd1 İlk yorumunuza dönelim, prosedürel tekniklerle ne kadar deneyiminiz olduğunu bilmiyorum (Çoğunlukla OO etiketlerinde aktif olduğunuzu görüyorum). void*Genellikle önlenebilir. Özel davranış eklerken tipik örüntü, bir işlev işaretçisi ve void*kullanıcı verileri için bir geçmektir . Genel bir arayüz genellikle buna benzer. Daha sonra kütüphane void*bunu başka bir şey yapmadan geri aramanıza geri gönderir . Çoğu zaman fazladan veriniz olmaz, bu nedenle NULL iletirsiniz ve geri aramada kullanıcı parametresini yok sayarsınız. Bunu bildiğini sanıyordum.
Calmarius

@Calmarius "Çoğu zaman fazladan veriniz olmaz" -> Bu aslında polimorfizmin avantajıdır. Boş işaretçiler kullanmadan fazladan veri bağlamak kolaydır. Yani, bahaneniz temelde "Zaten bu özelliği gerçekten kullanmıyorum."
user2445507

15

Hiç kimsenin kütüphanelerden bahsetmemesine şaşırdım. Pek çok dil C kütüphanelerine bağlanabilir ve C işlevlerini çağırabilir (extern "C" ile C ++ dahil). C ++, C ++ kitaplığını kullanabilen hemen hemen tek şeydir ('C ++' da C'de olmayan özellikleri kullanan [aşırı yüklenmiş işlevler, sanal yöntemler, aşırı yüklenmiş operatörler, ...] ve dışa aktarmayan bir kitaplık olarak tanımlanır. extern "C" 'aracılığıyla C uyumlu arayüzler aracılığıyla her şey).


1
Öyle değil; C'ye göstermek için işlevlerinizi "C" veya __cdecl kullanabilirsiniz.
Crashworks

Harika, ama bu başka hangi dillerle çalışıyor?
BigSandwich

2
C lib çok daha fazla yerde çalışabilir.
BigSandwich

1
C'ye bağlanabilenlerin tümü
Crashworks

2
Birlikte çalışabilirlik sorunlarının en bariz nedeni isim değiştirme ve bence bu konuya değinmeye değer.
Tom

15

Kodunuzun hemen hemen her programcı tarafından anlaşılmasını istiyorsanız C yazın.


12

Çünkü C99'da C ++ 'da eşdeğerleri olmayan özellikleri kullanmak istiyorlar.


Ancak, insanların ilk bakışta düşündükleri kadar C ++ için yararlı olan çok sayıda C99 özelliği yoktur. Değişken uzunluklu diziler? C ++, std :: vektörlere sahiptir. Karmaşık / hayali sayılar için destek? C ++ şablonlu karmaşık bir türe sahiptir. Tip-genel matematik fonksiyonları? C ++, standart matematik işlevlerini aşırı yükleyerek aynı sonuca neden oldu.

Adlandırılmış başlatıcılar? C ++ 'da değil, ancak bir çözüm var:

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

Bu, aşağıdaki gibi şeyler yazmanıza olanak tanır:

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

Duyun, duyun! C ++ 'da adlandırılmış atanmış başlatıcıların olmaması, onu her kullanmam gerektiğinde beni duvarda yukarı çekiyor.
ephemient

2
Başlatıcılarda% 100 yanındayım !!!
Yargıç Maygarden

Bir işlevin dışında genel bir yapıyı başlatmak istiyorsanız (böylece _ * () .setleyemezsiniz), C ++ sizi adsız başlatıcı sözdizimi kullanmaya veya yapınız için bir kurucu yazmaya zorlar. Bu seçeneklerden hiçbirini sevmiyorum.
ephemient

C99'da (GCC) çalışmaktan çok daha kolay olan VLA'lar da vardır std:vector.
Vahid Amiri

10

Çünkü birçok programlama görevi için C daha basit ve yeterince iyidir. Özellikle hafif yardımcı programları programlarken, C ++ 'nın sadece kodu yazmak yerine kendi iyiliği için zarif bir üst yapı oluşturmamı istediğini hissedebiliyorum.

OTOH, daha karmaşık projeler için, zarafet klavyemden doğal olarak akacağından daha iyi sağlam bir yapısal sertlik sağlar.


8

C ++ 'nın önemli özelliklerinin çoğu bir şekilde sınıfları veya şablonları içerir. Bunlar, derleyicinin bunları nesne koduna dönüştürme şekli dışında harika özelliklerdir. Çoğu derleyici, ad değiştirme kullanır ve en azından dağınık bir şey yapmayanlar.

Sisteminiz, birçok uygulamada olduğu gibi kendi başına çalışıyorsa, C ++ iyi bir seçimdir.

Sisteminizin zorunlu olarak C ++ ile yazılmayan yazılımlarla (en sık olarak assembler veya Fortran Kitaplıklarında) etkileşime girmesi gerekiyorsa, o zaman dar bir noktadasınız. Bu tür durumlarla etkileşim kurmak için, bu semboller için ad karıştırmayı devre dışı bırakmanız gerekir. bu genellikle bu nesneleri bildirerek yapılır extern "C", ancak bunlar şablonlar, aşırı yüklenmiş işlevler veya sınıflar olamaz. Bunların uygulama API'niz olma ihtimali varsa, bunları yardımcı işlevlerle sarmalamanız ve bu işlevleri gerçek uygulamalarla senkronize etmeniz gerekir.

Ve gerçekte, C ++ dili, saf C'de kolayca uygulanabilen özellikler için standart bir sözdizimi sağlar.

Kısacası, birlikte çalışabilir C ++ ek yükü çoğu insanın haklı gösteremeyeceği kadar yüksektir.


3
Bunu duyduğuma çok şaşırdım çünkü C ++ 'da, C veya başka bir CLR dilinden çağrılabilmeleri için harici "C" arayüzleri olan çok sayıda .DLL yazdım. Kesinlikle üye işlev işaretlerini açığa çıkaramazsınız, ancak __cdecl çağrısı için gerçekten çok fazla sorun yok.
Crashworks

1
Aslında, şablonlu kodu dışa aktarabilirsiniz. Ad çakışmalarını önlemek için kullanmak istediğiniz her tür için şablon olmayan işlev sarmalayıcıları gerektirir.
Yargıç Maygarden

8

Bu oldukça sığ ama meşgul bir öğrenci olarak C'yi seçtim çünkü C ++ 'nın öğrenmesinin çok uzun süreceğini düşündüm. Üniversitemdeki pek çok profesör Python'daki ödevleri kabul etmiyor ve bir şeyi hızlı bir şekilde almam gerekiyordu.


8
Öğretmenlerinin bilge!
Andrei Ciobanu

6

"Sadece kullanmak istediğiniz C ++ alt kümesini kullanın" hakkında bir açıklama: Bu fikirle ilgili sorun, projedeki herkesin aynı alt kümeyi kullanmasını sağlamanın bir maliyetinin olmasıdır. Benim fikrim, bu maliyetlerin gevşek bağlı projeler (örneğin açık kaynak kodlu projeler) için oldukça yüksek olduğu ve ayrıca C ++ 'nın daha iyi bir C olma konusunda tamamen başarısız olduğu, yani C'yi nerede kullanırsanız kullanın C ++' ı kullanamayacağınızdır.


6

Aman Tanrım, C vs C ++, bir alev savaşı başlatmanın harika bir yolu. :)

C'nin sürücü ve gömülü kod için daha iyi olduğunu düşünüyorum.

C ++, C'nin sahip olmadığı bazı harika özelliklere sahiptir, ancak C ++ 'nın nesne yönelimli özelliklerinin çoğu, insanlar perde arkasında ortaya çıkan bariz olmayan yan etkilerle kod yazdıklarında muazzam kodlama karışıklıklarına neden olabilir. Çılgın kod kurucularda, yıkıcılarda, sanal işlevlerde gizlenebilir ... C kodunun güzelliği, dilin arkanızda açık olmayan hiçbir şey yapmamasıdır, böylece kodu okuyabilir ve her kurucu ve yıkıcıya bakmanıza gerek kalmaz. ve bunun gibi. Sorunun çoğu, BAZI kişilerin yaptığı kötü kodlama uygulamalarıdır.

Mükemmel dilim, C99 ve ikili çıktıya SIFIR (veya sıfıra yakın) derleyici ek yükü ekleyen daha güvenli C ++ özelliklerinin minimum bir alt kümesinin bir kombinasyonu olacaktır. Mükemmel eklemeler, sınıf kapsülleme ve veri ve fonksiyonların isimlendirme kavramları olacaktır.


C + veya C100 olarak adlandırın: _)
m3nda

4

C ++ yerine C'yi neden seçmek isteyeceğinize dair çok fazla kanıt bulamadım.

Söyleyeceğim şeye neredeyse kanıt diyemezsiniz; bu sadece benim fikrim.

İnsanlar C'yi sever çünkü programcının zihnine çok iyi uyuyor.

C ++ 'ın birçok karmaşık kuralı vardır [ne zaman sanal yıkıcılara ihtiyaç duyarsınız, bir kurucuda sanal yöntemleri ne zaman çağırabilirsiniz, aşırı yükleme ve geçersiz kılma nasıl etkileşim kurar, ...] ve hepsine hakim olmak çok çaba gerektirir. Ayrıca referanslar arasında, operatörün aşırı yüklenmesi ve işlevin aşırı yüklenmesi, bir kod parçasının anlaşılması, bulunması kolay olabilecek veya olmayabilecek diğer kodları anlamanızı gerektirebilir.

Kuruluşların neden C ++ yerine C'yi tercih ettiklerine dair farklı bir soru. Bunu bilmiyorum, ben sadece bir insanım ;-)

C ++ 'ın savunmasında, masaya değerli özellikler getiriyor; En çok değer verdiğim değer muhtemelen parametrik ('ish) polimorfizmdir: bir veya daha fazla türü bağımsız değişken olarak alan işlemler ve türler.


2
++score: “İnsanlar C'yi seviyor çünkü programcının zihnine çok iyi uyuyor” ifadeniz çok güzel ifade edilmiş. Basit bir dilde programlayabilmek, gördüğünüz şeyin elde ettiğiniz şey olduğunu bildiğiniz bir programlama dili için gerçekten çekici bir özelliktir.
tchrist

3

C'nin size optimizasyon ve verimlilik üzerinde C ++ 'dan daha iyi kontrol sağladığını ve dolayısıyla bellek ve diğer kaynakların sınırlı olduğu ve her optimizasyonun yardımcı olduğu durumlarda faydalı olacağını söyleyebilirim. Tabii ki daha küçük bir ayak izine sahip.


Bunlardan örnekler verebilir misiniz?
Andrew Grant

Yani bir C derleyicisi kullanılarak derlenen aynı C kodu, bir C ++ derleyicisi kullanılarak derlendiğinde bundan daha verimli olacaktır?
Steve Kuo

1
Yıllar önce Linux çekirdeği gcc veya g ++ ile derlenebiliyordu, ancak g ++ daha yavaş kod oluşturuyordu ( "Son olarak, Linus geliştirme çekirdeğini korurken ..." altında tux.org/lkml/#s15-3 ).
Max Lybbert

Sanırım kodunuzun C ++ üzerinde C ++ ile nasıl optimize edildiğini daha fazla kontrol edebilmek için daha çok düşünüyordum. Assembly dilini kullanan bir programcının kodunda daha yüksek seviyeli bir dil kullanan bir programcının koduna daha hassas bir şekilde ince ayar yapabilmesi gibi.
Chris

2

Bazı mağazaların C ++ 'ın bazı özelliklerini C benzeri bir şekilde kullanma, ancak sakıncalı olanlardan kaçınma yaklaşımı da var. Örneğin, sınıfları ve sınıf yöntemlerini ve işlev aşırı yüklemesini kullanma (bunlar genellikle C kalıpçılarının bile başa çıkması kolaydır), ancak STL, akış operatörleri ve Boost (öğrenmesi daha zordur ve kötü bellek özelliklerine sahip olabilir).


1

Çünkü kaynakların sıkı olduğu (gömülü bir sistem veya çekirdek gibi bir tür gerçek çıplak metal kod gibi) bir sistem için yazıyorsunuz ve mümkün olduğunca az ek yük istiyorsunuz.

Çoğu gömülü sistemin bir C ++ derleyicisine sahip olmamasının bir nedeni var - bu, insanların bir tane istememesi değil, C ++ kodunu o küçük alana sıkıştırmak imkansız yaklaşan bir görevdir.


3
Aslında bir dil olarak C ++ 'nın kendisi için bir sorun değil, ancak şablonların gelişigüzel kullanımının neden olabileceği patolojik şişkinlik.
Crashworks

1
ecos büyük ölçüde C ++ ile yazılmıştır. Dil (C'ye kıyasla) ve çalıştırılabilir boyut arasında (hangi özellikleri kullanacağınızı bildiğiniz sürece) bir ilişki yoktur.
user52875

1
"hangi özellikleri kullanacağınızı bildiğiniz sürece". Bu nokta - "iyi, biz C ++ var ama yarım dil havai nedenlerle özellikleri destekleyemez" diyerek sonucu hem C programcısı öfkelendiriyor karıştırır ve Symbian / C ++, olduğu ve C ++ programcıları ...
Steve Jessop

1
Tüm noktalarda anlaştı. "Hangi özellikleri kullanacağımızı bilmek" için çözümümüz, sadece bir C derleyicisi kullanmak ve onu bir gün olarak adlandırmaktı. Elbette, C ++ 'ı çalıştırabilirdik (ki bu süper inek gibi bir şekilde gerçekten eğlenceli olurdu) ama gönderecek bir ürünümüz vardı ve bunun için endişelenecek vaktimiz yoktu.
Electrons_Ahoy

1

C'nin ihtiyacı olan şey daha iyi bir önişlemciydi. cfront biriydi ve bu nedenle c ++ doğdu

C kullanacağım, burada 'önişlemci olarak c ++' uygun olmaz.

Eminim, iyi yazılmış herhangi bir c ++ kitaplığının / çerçevesinin / araç setinin altında, dirty-old-c (veya aynı olan statik yayınlar) bulacaksınız.


0
  • Birkaç yıl öncesine kadar, mevcut C ++ derleyicilerinde önemli özellikler eksikti ya da destek zayıftı ve desteklenen özellikler aralarında çılgınca değişiklik gösteriyordu ve bu nedenle taşınabilir uygulamalar yazmak zordu.
  • Sembollerin standart adlandırılmaması nedeniyle, diğer dillerin / uygulamaların C ++ sınıflarını doğrudan desteklemesi zordur.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.