Quando usare C su C ++ e C ++ su C?


164

Sono stato introdotto all'Informatica per poco più di un anno ormai e dalla mia esperienza sembra che C e C ++ siano entrambi considerati linguaggi "ultraveloci", mentre altri come Python e tali linguaggi di scripting sono generalmente considerati un po 'più lenti .

Ma ho anche visto molti casi in cui un progetto software o anche uno piccolo avrebbero interlacciato file in cui un certo numero n di quei file sarebbe stato scritto in C e un certo numero m di quei file sarebbe stato scritto in C ++.

(Ho anche notato che i file C ++ hanno quasi sempre le intestazioni corrispondenti, mentre i file C non sono così tanto). Ma il mio principale punto di indagine è quello di ottenere un senso generale dell'intuizione su quando è appropriato usare C su C ++ e quando è meglio usare C ++ su C. A parte i fatti che (1) C ++ è orientato agli oggetti, mentre C non lo è, e (2) le sintassi sono molto simili, e C ++ è stato creato intenzionalmente per assomigliare a C in molti modi, non sono sicuro di quali siano le loro differenze. Mi sembra che siano (quasi) perfettamente intercambiabili in molti settori.

Quindi sarebbe apprezzato se qualcuno potesse chiarire la situazione! Grazie


4
L'uso di C inline nel codice C ++ è in genere per alcuni moduli che devono essere altamente ottimizzati, eseguire lavori di livello molto basso più vicini all'hardware o sono fondamentali per l'integrità dei dati o persino per la sicurezza umana e devono essere verificabili e provati correttamente. Invece di fare tutto in C, la maggior parte del progetto può sfruttare le funzionalità C ++ per progettazioni flessibili, ottenendo allo stesso tempo i vantaggi della tenuta di C in quei luoghi dove è necessario.
kylben,

30
@kylben: Molti ragazzi di C ++ ti diranno: (1) Le prestazioni non sono un motivo per passare a C (forse per evitare virtuale alcune altre funzionalità che impediscono le ottimizzazioni, ma ad esempio le non virtualclassi non sono intrinsecamente inefficienti, e i modelli sono un potente strumento di astrazione che può effettivamente portare a risultati più efficienti, ad es. qsortvs std::sort). (2) Un'alta importanza della correttezza è una ragione per usare C ++ (typesafety, constness ,, privateRAII per rendere gestibile la gestione delle risorse, ecc.) Rispetto a C. O per quella materia, usa Ada o qualcosa in primo luogo.

11
@ Pubby8 Non sono d'accordo con questo. Se sto lavorando su un file .c e vedo che la gente lo fa, tendo a segnalarli mentalmente perché non sanno cosa stanno facendo. Ad esempio, non è necessario eseguire il cast da void*un altro tipo di puntatore nel codice C, è molto distraente e tipico delle persone che non conoscono C.
asveikau

4
@kylben: (Potresti voler imparare ad indirizzare correttamente gli altri nelle tue risposte ai commenti, così hanno la possibilità di vederli effettivamente .) Che "un programmatore che abbia molta familiarità con il modo in cui il compilatore trasforma C in asm" funzionerebbe per C ++ proprio come bene. Ma questo è semplicemente irrilevante: se vuoi dilettarti in asm, scrivi asm invece di fare in modo che un compilatore lo crei da un'altra lingua. Il modo in cui ciò potrebbe cambiare con ogni aggiornamento del compilatore, dopo tutto.
sbi,

9
Secondo la mia modesta opinione ... usi C quando vuoi, per me: C è molto più semplice e facile da usare rispetto a C ++ ... C ++ potrebbe apparire come una "C con classi", ma non lo è più, ora lo è un linguaggio molto complesso, con cose come costruttori e modelli virtuali.
dysoco,

Risposte:


184

Scegli C quando

  • hai bisogno di un assemblatore portatile (che in realtà è C) per qualsiasi motivo,
  • la tua piattaforma non fornisce C ++ (un compilatore C è molto più facile da implementare),
  • devi interagire con altre lingue che possono interagire solo con C (di solito il minimo comune denominatore su qualsiasi piattaforma) e il tuo codice è costituito da poco più dell'interfaccia, non vale la pena posare un'interfaccia C su un codice C ++,
  • fai hacking in un progetto Open Source (molti dei quali, per vari motivi , si attengono a C),
  • non conosci C ++.

In tutti gli altri casi dovresti scegliere C ++.


15
Vorrei anche aggiungere che il C ++ con il modello di eccezione a volte porta più problemi di quanti ne vale la pena, per esempio, kernel del sistema operativo. Almeno questa è la sensazione generale che ho avuto mentre leggevo cose.
Coder

12
@SF: C è la lingua franca? Questo è nuovo O meglio, molto vecchio. Forse se conversi solo con persone che non hanno imparato nuove lingue negli ultimi 20 anni, ma direi che la conoscenza del C non è più molto comune.
DeadMG

13
@SF .: Come ho scritto altrove, ho partecipato a progetti che ammontavano a milioni di LoC e ho visto pochissime meta-cose rispetto ai progetti C con il loro inevitabile e onnipresente hackeraggio macro. (OTOH, la capacità di creare EDSL quando necessario può essere uno strumento incredibilmente potente nella tua scatola.) Per quanto riguarda C come lingua franca: preferirei attenermi al mio termine che è il minimo comune denominatore. E non vorrei che le persone con moderate capacità di programmazione hackerassero un kernel del sistema operativo.
sabato

18
@Max: non sono completamente d'accordo. C è un linguaggio inutile, a meno che una barriera pratica insormontabile impedisca l'uso del C ++.
DeadMG,

17
@Buttons: Sei stato tu a fare una richiesta ("C ++ ha bisogno di più memoria"), quindi dovresti essere tu a sostenerlo. E, no, non sto sostenendo che C ++ abbia bisogno di meno memoria. Quello che sto dicendo è che le funzionalità costano, indipendentemente dal fatto che il compilatore le implementi per te (funzioni virtuali) o che tu le faccia da te (array di puntatori a funzioni).
sbi,

88

Ci sono alcuni motivi per preferire C. Il principale è che tende a essere più difficile produrre eseguibili veramente minuscoli con C ++. Per sistemi molto piccoli, raramente stai scrivendo molto codice e lo spazio extra sulla ROM che sarebbe necessario per C ++ piuttosto che C può essere significativo.

Dovrei anche aggiungere, tuttavia, che per sistemi molto piccoli, C ha problemi esattamente per lo stesso motivo e il linguaggio assembly è quasi l'unica scelta ragionevole. La gamma di dimensioni del sistema in cui C ha davvero senso è piuttosto piccola e si restringe costantemente (anche se lo ammetto, abbastanza lentamente).

Un altro tempo / motivo per usare C è quello di fornire un insieme di funzioni a cui puoi legare essenzialmente da qualsiasi altra lingua. È possibile scrivere queste funzioni in C ++ da definendole come extern "C"funzioni, ma così facendo limita quelle funzioni a presentare un "volto" essenzialmente C-vita al mondo - le classi, funzioni sovraccaricate, modelli e funzioni membro, ecc, non è necessario applicare. Tuttavia, ciò non limita necessariamente lo sviluppo a C: è perfettamente ragionevole utilizzare qualsiasi tipo di funzionalità C ++ internamente , purché l'interfaccia esterna assomigli a C.

Allo stesso tempo, devo dire che le risposte di @ Toll (per un ovvio esempio) hanno cose quasi all'indietro sotto molti aspetti. Il C ++ ragionevolmente scritto sarà generalmente almeno veloce quanto il C, e spesso almeno un po 'più veloce. La leggibilità è generalmente molto migliore, se non altro perché non sei sepolto in una valanga di tutto il codice anche per gli algoritmi e le strutture di dati più banali, tutta la gestione degli errori, ecc.

I modelli non "risolvono un problema con il sistema di tipi di linguaggio", ma semplicemente aggiungono una serie di funzionalità fondamentali quasi completamente assenti da C e / o C ++ senza modelli. Uno degli intenti originali era quello di fornire contenitori sicuri per i tipi, ma in realtà vanno ben oltre - essenzialmente nessuno dei quali C fornisce affatto.

Anche gli strumenti automatizzati sono per lo più un'aringa rossa - mentre è vero che scrivere un parser C è meno lavoro che scrivere un parser C ++, la realtà è che alla fine non fa praticamente alcuna differenza. Pochissime persone sono disposte o in grado di scrivere un parser utilizzabile per entrambi. Come tale, il punto di partenza ragionevole è Clang in entrambi i casi.

In effetti, C e C ++ sono abbastanza frequentemente usati insieme sugli stessi progetti, gestiti dalle stesse persone. Ciò consente qualcosa che altrimenti sarebbe piuttosto raro: uno studio che confronta direttamente, oggettivamente la manutenibilità del codice scritto nelle due lingue da persone che sono ugualmente competenti nel complesso (cioè esattamente le stesse persone). Almeno nello studio collegato, una conclusione era chiara e inequivocabile: "Abbiamo scoperto che l'uso di C ++ anziché C comporta un miglioramento della qualità del software e uno sforzo di manutenzione ridotto ..."


12
Il supporto degli strumenti non è un'aringa rossa. Certo, al giorno d'oggi abbiamo clang. Ma strumento di supporto per C ++ fa ritardo dietro oder lingue considerevolmente, anche nelle grandi IDE-shot. Perché? Semplice, perché fino a poco tempo fa non c'era nessun clangore (e GCC non era mai un'alternativa). Fino a forse mezzo anno fa, se avevi bisogno di un AST di codice C ++, in pratica eri sfortunato o con migliaia di dollari (se hai acquistato il frontend EDG).
Konrad Rudolph,

5
+1 e, per la cronaca, scrivo regolarmente codice C ++ per processori a 8 bit con ROM 4KiB.
avakar,

2
+1 per un'ottima risposta generale. Ciò che non capisco (non ho esperienza con questo) è il motivo (immagino che stiamo parlando embedded?) Un compilatore C dovrebbe produrre un codice eseguibile più piccolo di un compilatore C ++ dato lo stesso set di funzionalità utilizzato ? Forse potresti fornire dei riferimenti?
Martin Ba,

2
@Martin: la cosa principale è che C ++ include la gestione delle eccezioni, che (almeno di solito) aggiunge un minimo alla dimensione dell'eseguibile. La maggior parte dei compilatori ti consente di disabilitare la gestione delle eccezioni, ma quando lo fai il risultato non è più abbastanza C ++. Sospetto che ci sia un po 'anche dal semplice fatto che molti produttori di compilatori C ++ non lavorano altrettanto duramente per produrre il codice di output più piccolo possibile.
Jerry Coffin,

3
"Abbiamo scoperto che l'utilizzo di C ++ anziché C comporta una migliore qualità del software e una riduzione degli interventi di manutenzione ..." questa è la conclusione da ricordare.
Stephane Rolland,

24

Le differenze tra C e C ++ sono già state enumerate in dettaglio qui . Mentre a volte le persone possono avere motivi legittimi per scegliere l'uno o l'altro (C ++ per OOP o C quando sentono che le funzionalità extra di C ++ introducono spese generali indesiderate, per esempio), nella mia esperienza di solito si riduce alla preferenza. Cosa sanno meglio le persone che lavorano su questo file e come preferiscono? Credo che questo sia il motivo per la maggior parte del tempo, poiché è vero che questi linguaggi affrontano entrambe le applicazioni critiche per le prestazioni.

(Nota a margine : dai un'occhiata a Linus Torvads per il motivo per cui preferisce la C al C ++. Non sono necessariamente d'accordo con i suoi punti, ma ti dà un'idea del perché le persone potrebbero scegliere la C rispetto al C ++. Piuttosto, le persone che sono d'accordo con lui potrebbe scegliere C per questi motivi.)


51
-1per Linant. : - {
sbi,

12
Non prenderne uno me per quello! Haha. Non sono d'accordo con Linus, ma è un buon esempio del PERCHÉ le persone potrebbero scegliere C su C ++ (se credono in ciò che Linus crede). Non sto commentando la legittimità di tali motivi.
Casey Patton,

10
@CaseyPatton: Fondamentalmente, declasserò ogni risposta che presenta questa retorica non commentata come se fosse un vero argomento.
sbi,

11
@Coder: non è necessario conoscere l'implementazione STL. Il punto fondamentale dell'STL è che non è necessario conoscere l'implementazione, a meno che non si faccia affidamento su comportamenti non definiti dallo Standard, nel qual caso, perché preoccuparsi di utilizzare la libreria Standard? Inoltre, è più che un po 'folle non amare una lingua a causa del comportamento degli sviluppatori. I programmatori C si comportano come C è un dono di Dio per l'uomo e sono troppo ciechi per vedere l'ovvia verità che C ++ offre funzionalità che sono fondamentalmente e intrinsecamente direttamente superiori a C, come RAII.
DeadMG,

8
@Coder: se finisci con così tanti shared_ptrs su un singolo oggetto da traboccare il contatore interno, stai sbagliando. Lo standard specificherà una dimensione minima per il contatore, probabilmente a 32 bit, ed è piuttosto irrealistico dover avere più di 2 miliardi di shared_ptrs su un singolo oggetto. Anche se l'oggetto stesso aveva dimensioni 0 e avevi un allocatore di memoria zero, allora stai ancora consumando 16 GB di memoria, solo su shared_ptrs.
DeadMG

13

Il problema principale mancante nelle risposte esistenti (al momento del post) è la scelta.

È semplice. Se, per qualche ragione assolutamente irrazionale, ritieni che le eccezioni non valgano il sovraccarico, non devi usarle . Puoi ancora avere modelli, RAII e la libreria Standard e non scrivere mai un singolo "lancio". Lo stesso vale per i modelli. Se, per qualche motivo, ritieni che causino un gonfiore eseguibile irrevocabile (e in realtà importante, che è solo su incorporato), allora sorpresa: puoi usare anche void * e sizeof (T) tutto il giorno. Nulla ti costringe a utilizzare nessuna delle funzionalità C ++ su C.

Ecco perché C ++ è un linguaggio intrinsecamente superiore: puoi scegliere le funzionalità che desideri e tornare alla programmazione in stile C quando non ti piace una determinata funzionalità. Pertanto, dato che C ++ è tutto ciò che è C e altro, è ovvio che C ++ è un linguaggio superiore. Suggerire altrimenti è come provare a suggerire che 4 è maggiore di 5.


1
Seguendo il tuo ragionamento non c'è alcun punto nella domanda originale e quindi dovrebbe essere chiusa. Immagino che la domanda dovrebbe essere letta in qualche modo: quando dovremmo limitarci al sottoinsieme C di C ++ (usare il semplice C) e quando ha senso usare il C ++ completo.
Giorgio,

Questo è vero, ma solo per i casi in cui una persona lavora al proprio piccolo progetto. Nella vita reale quasi tutti trascorrono forse metà del loro tempo a lavorare sul codice di altre persone. Sfortunatamente la maggior parte delle altre persone "pensano male" per quanto riguarda quei motivi assolutamente irrazionali.
DarenW,

1
@DeadMG: in che modo gli allocatori devono segnalare errori senza generare eccezioni? Inoltre, aggiungere più funzionalità non è necessariamente migliore quando tutto ciò che fa è aggiungere complessità o ridondanza.
Mankarse,

@Mankarse: se si compila con le opzioni per disabilitare le eccezioni, gli allocatori interrompono il programma o procedono allegramente all'utilizzo di un puntatore nullo, a seconda dell'implementazione della libreria.
Zan Lynx,

4
@Mankarse: dalla mia esperienza nel 2007, quando ho provato a eseguire un sistema Linux con 1 GB di RAM e senza scambio, quasi tutto il software desktop fallisce in modo orribile e terribile quando l'allocazione della memoria fallisce comunque.
Zan Lynx,

9

Cose su C ++ che rendono nervosi i programmatori C.

C'è molta magia che sta accadendo sotto il cofano; costruttori, distruttori, metodi virtuali, modelli, ecc., possono rendere il codice C ++ molto più semplice e veloce da scrivere rispetto al codice C equivalente, ma più difficile da comprendere e ragionare (a seconda di quanto conosci C ++ e le sue convenzioni associate). Qualcosa di così semplice come Foo newFoo;può invocare molto codice, a seconda di come Fooè stato definito il costruttore per la classe (e qualsiasi classe da cui dipende). Questo è anche il motivo per cui la convenzione deve scrivere ++itinvece che it++quando si scorre in un contenitore, poiché postfix ++comporta spesso un'operazione di copia costosa.

A seconda di ciò che stai facendo, può esserci un sovraccarico non banale, soprattutto per attività semplici. Prendi i seguenti due programmi, il primo in C, il secondo in C ++:

/* C version */
#include <stdio.h>
int main(void)
{
  char greeting[] = "Hello, world";
  printf("%s\n", greeting);
  return 0;
}
/* end C version */

/* C++ version */
#include <iostream>
#include <string>
int main(void)
{
  std::string greeting("Hello, world");
  std::cout << greeting << std::endl;
  return 0;
}
/* end C++ version */

Comportamento identico, non molta differenza in termini di sorgente, ma sulla scatola di SLES 10 su cui lavoro con gcc 4.1.2, il primo genera un eseguibile di ~ 9kb di dimensioni, mentre il secondo prende 12,5kb (nessuna ottimizzazione ), quasi il 28% più grande. Il stringtipo C ++ è molto più facile da lavorare con IMO rispetto alla libreria di stringhe C, e i flussi C ++ sono molto più flessibili e personalizzabili rispetto ai flussi C, ma per un codice davvero morto come questo, potrebbero non valere l'overhead.

Il C ++ è un linguaggio enorme rispetto al C, con una semantica estremamente complessa. Ci vuole molto più tempo per acquisire padronanza del C ++ rispetto al C, il che significa che molte persone che affermano di conoscere il C ++ non lo conoscono come pensano di fare.

Cose su C che rendono nervosi i programmatori C ++

C non è un linguaggio di programmazione sicuro per alcun tratto dell'immaginazione; nessun limite di controllo sugli array porta a un sacco di comportamento sfruttabile (sia attraverso la funzione ormai morta gets, sia attraverso scanfgli identificatori di conversione %se %[). Il C ++ almeno ti dà contenitori che generano eccezioni se provi ad accedere al di fuori del loro intervallo attualmente definito; tutto ciò che ti dà C è (se sei fortunato) una violazione della segmentazione.

La gestione della memoria in C è molto laboriosa e soggetta a errori, rispetto agli strumenti forniti da C ++. Se stai costruendo il tuo contenitore, sei responsabile della corrispondenza di tutte le chiamate malloce free, assicurandoti che le allocazioni abbiano esito positivo, il backup di eventuali allocazioni parziali in caso di errore, ecc. In C ++, aggiungi semplicemente elementi a o rimuovere gli oggetti dal contenitore. Se c'è un problema, verrà generata un'eccezione.

Allo stesso modo, la gestione degli errori in C è un dolore nel culo rispetto agli strumenti forniti da C ++ (vale a dire, eccezioni). La cosa davvero divertente è quando hai allocato un mucchio di memoria e poi hai colpito un muro durante l'elaborazione; come è necessario tornare indietro, è necessario rilasciare quella memoria nel giusto ordine. Con i principi C ++ e RAII, questo è (relativamente) facile da fare.

Quindi, quando uso uno sopra l'altro?

Se quello che stai scrivendo è una palude semplice, leggilo / confondilo / sbarazzati della sua applicazione, il cui comportamento può essere descritto in modo pulito in termini di input e output e le prestazioni contano, quindi preferisci C su C ++. Altrimenti, preferisci C ++


2
La gestione della memoria è complessa e soggetta ad errori in alcuni casi, ma soprattutto nel mondo embedded è spesso pratico scrivere programmi C usando l'allocazione di memoria interamente statica. Se il programma si collega, non può esaurire la memoria in fase di esecuzione. Tali garanzie possono essere facilmente ottenute in C ++?
supercat,

9

Bjarne Stroustrup mantiene un elenco di applicazioni e società che utilizzano C ++; puoi discutere sulla programmazione procedurale o OOP tutto ciò che desideri, ma non puoi discutere con i risultati del settore negli ultimi 20 anni.

Il C ++ è comunemente usato per progetti complessi su larga scala, multi-uomo, in cui persone separate devono lavorare su componenti modularizzati. Naturalmente è possibile creare e mantenere codice modularizzato in C, ma la natura intrinseca OOP di C ++ porta a una modularizzazione, testabilità e riutilizzo del codice superiori.

La libreria standard C ++ (STL), in sé con solo vettori e mappe, è una ragione sufficiente per usare C ++.

C è comunemente usato per i sistemi embedded.

Personalmente userei C solo se c'è qualche libreria che ha solo un'API C.


19
La tua frase finale non è un motivo per usare C. Puoi chiamare le librerie C da C ++.
user207421

2
Ho usato c ++ per un progetto DSP - non c
BЈовић

9

Direi che il motivo principale per cui sceglierei C su C ++, è solo quando dovrei ricorrere a "NASCONDI DEVE ESSERE stabile al 1000%".

Il C ++ è ~ 99% C quando osserviamo le prestazioni ed è molto più produttivo. Quindi, anche se in C puoi scrivere un codice che sarà più veloce di C ++ (puoi usare un sottoinsieme di C ++ senza eccezioni, virtuale, streaming, astrazioni, ecc., Ma questo è fondamentalmente C), il tempo per ottimizzare ogni maledetta cosa mentre STL è testato e lo fa già, ti costerebbe di più del piccolo guadagno in termini di prestazioni che potresti ottenere o sacrificare perché gli algoritmi STL sono stati scritti da gruppi di esperti e probabilmente non sei un esperto in tutto.

D'altro canto il C ++ ha un sacco di astrazioni. Quando in determinate circostanze perdono, questo ti mette nei guai. E ci sono poche persone che conoscono il 100% dei gotcha C ++, mentre, immagino, ce ne sono molti di più che conoscono tutti i gotcha C, quindi scrivere una soluzione in cui ogni passaggio è pienamente compreso da tutti i membri di una squadra è molto più facile in C.

Esempio: sai quando shared_ptr<smthn>supererà il conteggio dei riferimenti, genererà un'eccezione? Cose come queste non vanno bene quando Shuttle deve rientrare nell'atmosfera, almeno credo.

Inoltre, la gestione delle eccezioni è molto, molto difficile rispetto ai codici di errore. È difficile capire se la classe è al 100% sicura e facile da individuare. Molte persone di alto livello hanno espresso questa opinione.


12
E in che modo la gestione manuale della memoria è "più stabile" delle astrazioni del C ++ std::stringe simili? Hai mai provato a specificare una piattaforma in cui shared_ptril contatore si riverserebbe? Sarebbe un diavolo di una piattaforma divertente. E se ritieni che la gestione delle eccezioni sia difficile, dovresti dare un'occhiata a un codice C che controlla ogni possibile errore su ogni chiamata di funzione. (È difficile trovare un codice del genere, lo ammetto, ma questo è solo un argomento ancora più forte contro la tua affermazione.) Mi dispiace, ma si tratta di escrementi veramente bovini.
sbi,

12
@Lundin: 'Le implementazioni "Deve essere stabile al 1000%" non consentono in primo luogo l'allocazione dinamica della memoria'. E cosa ti impedisce di fare esattamente questo in C ++ ?? (E fare affermazioni generali sulla mia conoscenza ed esperienza piuttosto che fornire qualsiasi argomento è un trucco retorico piuttosto economico.)
sbi,

10
@Lundin: Bene, hai iniziato a fornire argomenti, piuttosto che retorica. Ma sono deboli. Il fatto che tu abbia "dimenticato" una delle caratteristiche principali di C ++ (modelli), una che rende il codice più sicuro (perché consente l'esecuzione di algoritmi - e quindi il fallimento - in fase di compilazione , eliminando gli errori di runtime), non parla a favore della tua conoscenza della lingua che stai giudicando. La riduzione del C ++ in un linguaggio OO è stata criticata prima qui, e per buoni motivi. (Inoltre, le lezioni con distruzione deterministica sono un ottimo strumento e utili per gestire altre risorse oltre alla semplice memoria.)
sbi,

9
@Lundin Ovviamente non vorrai utilizzarlo std::stringse non desideri un'allocazione dinamica. Useresti std::basic_string<char, std::char_traits<char>, some_allocator_here>.
Luc Danton,

10
@Coder: cosa pensi di dimostrare con questi? Il primo è semplicemente un codice errato (e sarebbe un errore nel riportare errori quanto i valori di ritorno), il secondo è un caso per RAII sulla pulizia manuale a cui ogni devoto C ++ decente farebbe il tifo, e Joel, tanto quanto me rispettarlo, ho detto alcune cose con cui non sono assolutamente d'accordo. La sua spina per entrata singola uscita singola puzza male di una vecchia scoreggia disinformata che non sarà mai d'accordo sul fatto che ciò che ha imparato 25 anni fa è superato. (Intendiamoci, io stavo programmando 25 anni fa, quando SESE era lo stato dell'arte.)
SBI

6

C è un assemblaggio portatile con una migliore sintassi, che offre al programmatore il pieno controllo di tutto .

Il C ++, d'altra parte, fa molta magia funky (funzioni virtuali, sovraccarico, conversione automatica, ecc. Ecc.) Che potrebbe non essere desiderabile quando vuoi assicurarti di:

  • non usare più memoria di quella che vuoi
  • non accedere alle pagine di memoria volenti o nolenti (la vtable può essere ovunque)
  • non invocare accidentalmente troppo codice

E vuoi qualcosa di veramente semplice con cui lavorare, dato che ti concentri sulle prestazioni.

Non ha sorprese, ed è molto prezioso.

Se vuoi (e lo consiglio), leggi le linee guida sulla codifica JSF su cosa devi pensare quando scrivi C ++ per il controllo dell'avionica militare. Ci sono molte trappole di cui devi essere consapevole, e potrebbero prenderti alla sprovvista. Bjarne faceva parte di quel documento, quindi sa di cosa si tratta.

Inoltre, C si compila come un troll scottato colpito da un fulmine. Il C ++, OTOH, è stato probabilmente sponsorizzato dalle stesse persone che hanno investito in società SSD. :)

(Personalmente, preferirei C ++, ma non mi piace neanche ...... ;-P)


1
Ci sono molte cose su cui C non offre il controllo. Prova a scrivere un codice portatile efficiente per moltiplicare un uint32_t per un uint32_t per ottenere un risultato uint32_t (32 bit di prodotto in basso). Se un intè di 64 bit, è necessario eseguire il cast di almeno un operando per uint64_timpedire un comportamento indefinito, ma dover eseguire il cast su 64 bit allo scopo di calcolare un risultato a 32 bit è - per dirla leggermente - "sorprendente".
supercat,

Non è. Il compilatore fa cose come le allocazioni dei registri per te. Non riesco a scrivere codice gestibile in assembly, in CI can.
Nils,

2

(dato che hai la stessa familiarità con entrambe le lingue)

Vai con C ++ a meno che non ci sia un compilatore C ++ per la tua piattaforma. Puoi scrivere il codice C ++ senza la parte della lingua che non ti piace (nessuna classe, eccezione, eredità virtuale, qualsiasi limitazione personale desideri applicare) e poi in futuro, se decidi di volere un po 'di dopo tutto, queste funzionalità possono essere facilmente utilizzate. Nulla in C ++ ti impedisce di scrivere codice in stile C.

(dati equivalenti set di strumenti e conoscenza degli sviluppatori) Non c'è motivo di scegliere C su C ++ purché la piattaforma disponga di un compilatore C ++. Puoi semplicemente limitarti al sottoinsieme della lingua che desideri oggi, lasciando la porta aperta per l'estensione in seguito.


1

Entrambe le lingue sono eccellenti. Penso che un certo numero di poster abbia dettagliato i punti di forza e i vari usi per ciascuno. Aggiungerò semplicemente questo:

Vedo il linguaggio C perfetto in 4 aree: 1) Penso che sia il miglior linguaggio da usare quando apprendi per la prima volta qualsiasi tipo di programmazione [combinato con un po 'di assembly e conoscenza del codice macchina], 2) è ottimo per scrivere driver, 3) incorporato software e 4) software di sistema al livello più basso.

Il C ++ è un linguaggio orientato agli oggetti, ma può anche essere procedurale (molto alla maniera di C). Se stai lavorando a progetti su larga scala, software basati su GUI, software di gioco e altri tipi di software graficamente intensivo, allora trovo C ++, Java o persino Objective-C la scelta migliore. Tuttavia, ci sono molti programmi da riga di comando o software di sistema in cui potresti trovare C ++ buono o migliore di C.


0

Secondo me manca un punto in questa discussione: in C è più semplice fornire un'interfaccia binaria stabile da una libreria. Sia per l'utilizzo con altre lingue che con C ++.

In C ++ compilatori diversi usano la manipolazione di nomi diversi, quindi i consumatori di una libreria compilata con un compilatore diverso dalla libreria potrebbero avere problemi ad usarla. Con C l'interfaccia binaria, di solito, è standardizzata per la piattaforma.

So che al giorno d'oggi i compilatori spesso hanno degli switch per produrre cose compatibili con gcc, ma ciò non sempre aiuta.

Lo osservo su Solaris relativamente spesso. La distribuzione e i diversi fornitori di software utilizzano in genere Sun Studio poiché, in particolare sui sistemi Sparc, spesso fornisce risultati migliori. I progetti open source di Man sono scritti con codice specifico di gcc. Può essere abbastanza doloroso far lavorare insieme quelli.


0

C è probabilmente preferibile a C ++ quando viene generato il codice C (ad esempio nelle implementazioni di linguaggi di livello superiore). Ad esempio, ci sono molti compilatori simili a Lisp che emettono codice C (ad esempio Chicken , Scheme48 ...), ma non ne conosco nessuno che emetta codice C ++ originale (il mio strumento MELT emette codice C ++, ma non lo chiamerò genuino Codice C ++, utilizza pochissime funzionalità C ++).

Il codice C è anche più facile da provare semi-automaticamente. Analizzatori statici come Frama-C (dove annoti il ​​tuo codice C con commenti ACSL per aiutare la proverante ragione del tuo codice) sono disponibili per C, ma non tanto per C ++ 11 completo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.