Perché qualcuno dovrebbe usare C su C ++? [chiuso]


132

Anche se alla gente sembra piacere lamentarsi del C ++, non sono stato in grado di trovare molte prove del perché tu voglia scegliere C piuttosto che C ++. C non sembra avere lo stesso difetto e se C ++ ha tutti questi problemi, perché non puoi limitarti al sottoinsieme C? Quali sono i tuoi pensieri / esperienze?


il collegamento duplicato esatto non funziona più ..... dice il ragazzo che è in ritardo alla festa c :)
kyle

4
C è davvero migliore e più semplice in C ++ ma qualsiasi programmatore C può convertire C ++ in C e ridere.
Bob Run

11
La cosa spaventosa è che la gente in generale pensa che "++" significhi che questo è davvero buono, beh scusa non lo è.
Bob Run

A parte l'ovvio - dispositivi piccoli / incorporati - in genere C è migliore per problemi di scricchiolio di numeri puri (ad es. Elaborazione grafica GPU, calcoli di fisica massicciamente paralleli, mining di pattern, ecc.) In cui le funzionalità OOP sono gonfie. Il C ++ è migliore per i sistemi di modellazione in cui le "cose" interagiscono, molto più facilmente con le funzionalità OOP.
Paceman,

3
Perché JavaScript, le migliori pratiche, c ++ e OOP sono stupidi / troppo impegnati nel tentativo di risolvere questi problemi astratti che probabilmente non esistono realmente o che non devono mai essere risolti.
Maresciallo artigianale il

Risposte:


132

La risposta di Joel è buona per motivi che potresti dover usare C, sebbene ce ne siano alcuni altri:

  • È necessario rispettare le linee guida del settore, che sono più facili da dimostrare e testare in C.
  • Hai strumenti per lavorare con C, ma non con C ++ (pensa non solo al compilatore, ma a tutti gli strumenti di supporto, copertura, analisi, ecc.)
  • I tuoi sviluppatori target sono guru C.
  • Stai scrivendo driver, kernel o altri codici di basso livello
  • Sai che il compilatore C ++ non è bravo a ottimizzare il tipo di codice che devi scrivere
  • La tua app non solo si presta ad essere orientata agli oggetti, ma sarebbe più difficile scrivere in quel modulo

In alcuni casi, tuttavia, potresti voler utilizzare C anziché C ++:

  • Volete le prestazioni dell'assemblatore senza il problema di scrivere codice nell'assemblatore (C ++ è, in teoria, capace di prestazioni "perfette", ma i compilatori non sono altrettanto bravi nel vedere le ottimizzazioni che vedrà un buon programmatore C)
  • Il software che stai scrivendo è banale, o quasi - elimina il minuscolo compilatore C, scrivi alcune righe di codice, compila e sei pronto - non è necessario aprire un enorme editor con helper, non è necessario scrivere praticamente classi vuote e inutili, gestione di spazi dei nomi, ecc. Puoi fare quasi la stessa cosa con un compilatore C ++ e usare semplicemente il sottoinsieme C, ma il compilatore C ++ è più lento, anche per piccoli programmi.
  • Hai bisogno di prestazioni estreme o di piccole dimensioni del codice e sai che il compilatore C ++ renderà effettivamente più difficile il raggiungimento a causa delle dimensioni e delle prestazioni delle librerie

Sostieni che potresti semplicemente usare il sottoinsieme C e compilare con un compilatore C ++, ma scoprirai che se lo fai otterrai risultati leggermente diversi a seconda del compilatore.

Indipendentemente da ciò, se lo stai facendo, stai usando C. La tua domanda è davvero "Perché i programmatori C non usano i compilatori C ++?" Se lo è, allora o non capisci le differenze linguistiche o non capisci la teoria del compilatore.


2
C'è anche lo standard MISRA C, che AFAIK non è ancora molto stabile per C ++.
Paul Nathan,

60
La parte della performance non è necessariamente vera. Ci sono molte aree in cui il C ++ può ottimizzare molto meglio di C. (Ovviamente anche il contrario è talvolta vero, ma generalmente scegliere C su C ++ per motivi di prestazioni è una cattiva idea).
jalf

9
Sarei interessato a maggiori informazioni sulle prestazioni. Non capisco perché C avrebbe solo prestazioni migliori "occasionalmente". Dato un programmatore medio, può darsi che C ++ renda le prestazioni più facili da raggiungere (buon uso dei pattern) ma un programma C scritto da un esperto dovrebbe essere più veloce - spese generali più basse.
Adam Davis,

3
Ovviamente, il programma C più veloce richiederebbe più tempo per scrivere ed eseguire il debug, quindi c'è un compromesso e data la velocità delle macchine raramente ne vale la pena, tranne che per le applicazioni specializzate, motivo per cui C ++ è generalmente migliore. (quando il codice è finito, i computer sono più veloci e mangiano il dif)
Adam Davis,

21
@Adam: C ++ funziona meglio di C con il codice "carino". C ++ può utilizzare modelli e funzioni incorporate in cui C necessita di una macro. L'overhead C ++ appare solo quando richiesto, altrimenti è uguale a C. (virtuale, try / throw, dynamic_cast). Gran parte del sovraccarico viene visualizzato solo nella dimensione dell'immagine del programma.
Zan Lynx,

88

Mi piace il minimalismo e la semplicità.


9
OK - abbastanza giusto ... quindi perché non Forth?
Jonathan Leffler,

14
Immagino che gli piaccia anche avere biblioteche, libri, forum disponibili?
Gnud,

30
mi piace il minimalismo e la semplicità della tua risposta ... :)
Joe DF

8
Essere d'accordo. C è molto semplice e "piccolo". C sembra sempre lo stesso e se sei un nuovo collaboratore di un progetto, è facile capire come funziona. c ++ ha molte cose inutili e quando guardo un progetto c ++ mi confondo all'istante. Riesco a capire le persone c ++ (un linguaggio C con funzionalità OO) ma C è solo più semplice e facile.
user69969

1
Inoltre penso che C sia un linguaggio molto più adatto per scrivere qualche tipo di libreria, come piccole librerie universali, linguaggi di scripting e, sì, motori di rendering.
Keebus,

65
  • Perché conoscono già C
  • Perché stanno costruendo un'app integrata per una piattaforma che ha solo un compilatore C.
  • Perché stanno mantenendo un software legacy scritto in C
  • Stai scrivendo qualcosa a livello di un sistema operativo, un motore di database relazionale o un motore di videogiochi 3D al dettaglio.

4
Alcuni microcontrollori hanno solo compilatori C che fanno davvero schifo. Le funzionalità di base di C ++ (spazi dei nomi, classi oltre a funzioni virtuali, enum, dichiarazione di variabili altrove oltre a top-of-block) sono le più preziose, IMHO.
Jason S,

2
Da ciò sembra che sceglieresti C solo se non ci fossero alternative ragionevoli.

2
@Joe: a parte il primo punto, quello su riassume. Molte delle lingue successive hanno preso C e hanno detto: "Ehi, possiamo fare di meglio ".
Joel Coehoorn,

1
Concordato. Se non stai usando le sofisticate funzionalità C ++, credo che il C ++ sia monotonicamente un C migliore. Con le funzionalità C ++ più sofisticate, le cose diventano più discutibili, ma il dibattito è di solito contro un livello più alto di astrazione, ad esempio Java.
Paul Nathan,

4
La maggior parte dei motori di gioco 3D utilizza infatti il ​​C ++. UE4 utilizza C ++, principalmente.
Aditya Kashi,

56

I timori di prestazioni o gonfiore non sono buoni motivi per rinunciare al C ++. Ogni lingua ha le sue potenziali insidie ​​e compromessi: i bravi programmatori ne sono a conoscenza e, se necessario, sviluppano strategie di coping, i programmatori poveri si sbagliano e incolpano la lingua.

L'interpretazione di Python è in molti modi considerata un linguaggio "lento", ma per compiti non banali un abile programmatore Python può facilmente produrre codice che viene eseguito più velocemente di quello di uno sviluppatore C inesperto.

Nel mio settore, i videogiochi, scriviamo codice ad alte prestazioni in C ++ evitando cose come RTTI, eccezioni o funzioni virtuali nei loop interni. Questi possono essere estremamente utili ma hanno problemi di prestazioni o gonfia che è desiderabile evitare. Se dovessimo fare un ulteriore passo e passare interamente a C, guadagneremmo poco e perderemmo i costrutti più utili di C ++.

Il principale motivo pratico per preferire il C è che il supporto è più diffuso del C ++. Esistono molte piattaforme, in particolare quelle integrate, che non hanno nemmeno compilatori C ++.

C'è anche la questione della compatibilità per i fornitori. Mentre C ha un ABI (Application Binary Interface) stabile e ben definito, C ++ no. L'ABI in C ++ è più complicato a causa di cose come vtables e costruttori / distruttori, quindi viene implementato in modo diverso con ogni fornitore e persino con le versioni di una catena di strumenti del fornitore.

In termini reali ciò significa che non è possibile prendere una libreria generata da un compilatore e collegarla con il codice o una libreria di un altro che crea un incubo per progetti distribuiti o fornitori di middleware di librerie binarie.


7
"L'interpretazione di Python è in molti modi considerata un linguaggio" lento ", ma per compiti non banali un abile programmatore Python può facilmente produrre codice che viene eseguito più velocemente di quello di uno sviluppatore C inesperto." Immagino che un programmatore (non necessariamente un Python Progammer) che abbia preso lezioni di algoritmi in grado di produrre codice che esegua più velocemente di quello di uno sviluppatore inesperto (in generale).
Andrei Ciobanu,

15
E lo stesso sviluppatore c inesperto produrrà codice Python che è più lento del suo codice c. Python è molto più lento di c.
Millie Smith l'

37

Ho scelto di scrivere in C perché mi piace lavorare con un linguaggio piccolo e stretto. Mi piace avere accesso a uno standard che può essere letto in un ragionevole lasso di tempo (per me - sono un lettore molto lento). Inoltre, lo uso per scrivere software per sistemi embedded per i quali esistono pochi compilatori C ++ desiderabili (come alcuni microcontroller PIC).


re: PICs - Sento il tuo dolore. Se dovessi mai fare molto codice PIC, probabilmente userò il compilatore IAR che supporta C ++. L'ho usato su MSP430 ed è abbastanza carino.
Jason S,

1
E non dimenticare i tempi di compilazione notevolmente migliorati per C. Nessun sistema di template.
Ingegnere

35

Prendo l'altro punto di vista: perché usare C ++ invece di C?

Il libro The C Programming Language (aka: K&R) spiega chiaramente come fare tutto ciò che la lingua può fare in meno di 300 pagine. È un capolavoro del minimalismo. Nessun libro C ++ si avvicina nemmeno.

L'ovvio controprogramma è che lo stesso si potrebbe dire della maggior parte, se non di tutte, le lingue moderne: non possono nemmeno dirti come fare tutto in poche centinaia di pagine. Vero. Quindi perché usare C ++ invece? Ricchezza delle funzionalità? Energia? Se hai bisogno di qualcosa di più ricco di funzionalità o potente, scegli C #, Objective C, Java o qualcos'altro. Perché caricarti delle complessità del C ++? Se hai bisogno del grado di controllo delle sovvenzioni C ++, sostengo di usare C. C può fare qualsiasi cosa e farlo bene.


Sono d'accordo. Voglio potere, quindi uso qualcosa di veramente potente, non il punto 1/2.
Dinah,

7
@Dinah: 1/2 punto di passaggio offre una potenza di espressione di livello superiore senza le prestazioni e il costo della memoria di C # o Java.
Zan Lynx,

5
@Zan Lynx: hai ragione. Ma spero prendendo la posizione opposta che ho fatto nel mio post originale che ho fatto un punto sulla fattibilità di C su C ++ ... anche se, come lei sottolinea, non è un caso aperto e chiuso.
Dinah,

28

Oltre a diversi altri punti già menzionati:

Meno sorpresa

cioè, è molto più facile vedere cosa farà esattamente un pezzo di codice . In C ++ devi avvicinarti al livello di guru per essere in grado di sapere esattamente quale codice genera il compilatore (prova una combinazione di modelli, ereditarietà multipla, costruttori generati automaticamente, funzioni virtuali e mescola un po 'di magia nello spazio dei nomi e ricerca dipendente dall'argomento).

In molti casi questa magia è piacevole, ma ad esempio nei sistemi in tempo reale può davvero rovinare la giornata.


27

La risposta di Linus alla tua domanda è "Perché il C ++ è un linguaggio orribile"

Le sue prove sono aneddotiche al massimo, ma ha un punto ..

Essendo più di un linguaggio di basso livello, lo preferiresti a C ++ .. C ++ è C con librerie aggiunte e supporto compilatore per funzionalità extra ( entrambe le lingue hanno funzionalità che l'altra lingua non ha, e implementano le cose in modo diverso ), ma se hai il tempo e l'esperienza con C, puoi beneficiare di ulteriori poteri correlati a basso livello ... [Modificato] (perché ti abitui a fare più lavoro manualmente piuttosto che a trarre vantaggio da alcuni poteri che provengono dal linguaggio / compilatore stesso)

Aggiunta di collegamenti:

Perché C ++ per embedded

Perché stai ancora usando C? PDF

Vorrei google per questo .. perché ci sono già molti commenti sul web


17
Ho scritto un sacco di codice in C, poi un breve periodo di tempo in C ++, poi un tempo imbarazzante con VB, e ora uso C # da alcuni anni. Da allora ho scritto un po 'di codice C e C ++ e ho capito che C è ben definito e stretto, C # è bello e potente e C ++ fa semplicemente schifo.
CMPalmer

25
Linus non è veramente qualificato per parlare dei meriti del C ++. Citarlo come se fosse una specie di oracolo è semplicemente stupido. E la cosa sul "fare le cose nel modo più duro" non ha senso. Ci sono buoni motivi per usare C, ma "è più lavoro", o "ha detto Linus" non sono tra questi.
jalf

8
@jalf, non citando Linus come se fosse una sorta di oracolo, è bene menzionare l'opinione di un programmatore noto per le sue scelte in uno dei programmi più usati al mondo: il kernel Linux. La domanda richiede opinioni (perché qualcuno dovrebbe scegliere C) è ciò a cui ho cercato di rispondere.
Ric Tokyo,

6
Linus è una pessima fonte di opinioni su C ++ perché non lo usa e, per quanto ne so, l'ho provato solo una volta nel 1990, qualcosa del genere.
Zan Lynx,

3
@Zan Linus ha mostrato più autocontrollo altrove: "Ci sarebbe piaciuto usare C ++ e le funzionalità extra che porta, ma è più difficile vedere dove codice cattivo in C ++ che in C". La citazione sulla mia risposta è una registrazione di un'opinione piuttosto che un "seguire il leader".
Ric Tokyo,

26

Perché stanno scrivendo un plugin e C ++ non ha ABI standard.


9
Sebbene sia vero, non è un motivo convincente per attenersi a C perché è possibile esportare le funzioni necessarie utilizzando il collegamento C e mantenere comunque l'implementazione in C ++.
codelogic

2
@codelogic - I progetti C ++ tendono ad esportare molti più tipi e funzioni rispetto ai progetti C equivalenti. È possibile nasconderlo in una libreria condivisa finale, ma è probabilmente più sforzo di quanto valga la pena.
Tom,

tbh non è una risposta davvero buona, ma +1 perché C ++ non ha ABI standard (sì .. C ++ fa schifo)
hasen

6
C non ha nemmeno un ABI standard.
Stephen Canon,

25

I tempi di compilazione lunghi possono essere fastidiosi. Con C ++ puoi avere tempi di compilazione molto lunghi (il che significa, ovviamente, più tempo per Stack Overflow!).


Perché questo è stato votato verso il basso? Faccio molto lavoro in C ++ da solo e non vorrei tornare a C, ma può davvero avere tempi di compilazione dolorosamente lunghi (pensate ai template, per esempio).
Frank

6
Uso C ++ per lavoro reale, ma prototipo sempre in C a causa dei tempi di compilazione quasi istantanei.
Tom,

Hmm, se fatto nel modo giusto, cioè non avendo gonfiato, potremmo aver bisogno di questi # include e non sono sicuro di quale sia il giusto-includi-così-io-li-includerò-tutti-# include i tempi di compilazione sono accurati. Quando faccio hacking su uno o tre file, mi ci vogliono solo 1-2 secondi per compilare i miei 100 progetti KLOC.
Sebastian Mach,

4
@Tom: Mi chiedo come sarà il tuo vero lavoro in C ++, se puoi prototipare in C. Non stai usando le funzionalità di C ++? Puoi elaborare?
Sebastian Mach,

24

Sono abituato a usare C ++ per i miei progetti. Poi ho ottenuto un lavoro in cui viene utilizzata la semplice C (una base di codice in evoluzione di 20 anni di un software AV con scarsa documentazione ...).

Le 3 cose che mi piacciono in C sono:

  • Niente è implicito: vedi cosa fa esattamente il tuo programma o meno. Questo semplifica il debug.

  • La mancanza di spazi dei nomi e sovraccarichi può essere un vantaggio: se vuoi sapere dove viene chiamata una determinata funzione, basta passare attraverso la directory del codice sorgente e te lo dirà. Non sono necessari altri strumenti speciali.

  • Ho riscoperto la potenza dei puntatori a funzione. Fondamentalmente ti permettono di fare tutte le cose polimorfiche che fai in C ++, ma sono ancora più flessibili.


8
+1 Tuttavia, tale polimorfismo in C è solitamente ottenuto tramite il vuoto *, che è pericoloso in quanto disabilita qualsiasi capacità del compilatore di verificare se si sta facendo qualcosa di brutto.
gd1

4
@ gd1 In pratica non ricordo un singolo caso in cui ciò ha void*causato problemi. Esistono molte tecniche di programmazione difensiva per proteggere dagli errori: inserire asserzioni ovunque, aggiungere numeri magici nelle tue strutture (nelle build di debug), ecc. Ma al giorno d'oggi abbiamo valgrind, dr. memoria e persino MSVC utilizza il codice per rilevare i problemi, quindi i problemi di corruzione della memoria sono abbastanza facili da risolvere.
Calmarius,

4
Non riscontro quasi mai corruzione della memoria nei miei programmi, ma se possibile preferirei che gli errori vengano rilevati prima di eseguire il programma. Casting void*per whatever*è qualcosa che il compilatore accetta in buona fede. Preferisco che il mio compilatore non si fidi di me e abbia la possibilità di imporre controlli di tipo affidabili. Gli errori di sostituzione dei template emessi dai compilatori C ++ sono difficili da leggere ma almeno la spazzatura non viene compilata.
gd1

1
@ gd1 Tornando al tuo primo commento, non so quanta esperienza hai con le tecniche procedurali (vedo che sei attivo principalmente nei tag OO). Il void*solito può essere evitato. Il modello tipico quando si aggiunge un comportamento personalizzato sta passando un puntatore a funzione e un void*per i dati utente. Un'interfaccia generica di solito si presenta così. Quindi la libreria quando lo void*restituisce al callback senza fare nient'altro con esso. Molto spesso non hai dati extra, quindi passi NULL e ignori il parametro utente nel callback. Ho presunto che tu lo sapessi.
Calmarius,

@Calmarius "Molto spesso non hai dati extra" -> Questo è in realtà il vantaggio del polimorfismo. È facile associare dati extra, senza usare i puntatori vuoti. Quindi, la tua scusa è fondamentalmente "Non uso davvero quella funzione comunque".
user2445507,

15

Sono sorpreso che nessuno abbia menzionato le biblioteche. Molte lingue possono collegarsi a C libs e chiamare funzioni C (incluso C ++ con "C" esterno). Il C ++ è praticamente l'unica cosa che può usare una lib di C ++ (definita come 'una lib che usa caratteristiche in C ++ che non sono in C [come funzioni sovraccaricate, metodi virtuali, operatori sovraccaricati, ...] e non esporta tutto attraverso interfacce compatibili C via extern "C" ').


1
Non così; puoi esternare "C" o __cdecl le tue funzioni per esporle a C.
Crashworks

Fantastico, ma con quali altre lingue funziona?
BigSandwich,

2
una libreria C può funzionare in molti più posti.
BigSandwich,

1
Tutti quelli che possono collegarsi a C.
Crashworks,

2
Il motivo più ovvio per i problemi di interoperabilità è la manomissione del nome, e penso che valga la pena sollevarlo.
Tom,

15

Se vuoi che il tuo codice sia compreso praticamente da qualsiasi programmatore scrivi in ​​C.


12

Perché vogliono usare funzionalità in C99 che non hanno equivalenti in C ++.


Tuttavia, non ci sono tante funzioni C99 utili a C ++ come la gente pensa a prima vista. Matrici a lunghezza variabile? C ++ ha std :: vectors. Supporto per numeri complessi / immaginari? C ++ ha un tipo complesso basato su modelli. Funzioni matematiche di tipo generico? Il C ++ ha sovraccaricato le funzioni matematiche standard, causando lo stesso risultato.

Inizializzatori con nome? Non in C ++, ma c'è una soluzione alternativa:

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

Questo ti permette di scrivere cose come:

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

Senti senti! La mancanza di inizializzatori designati con nome in C ++ mi fa salire il muro ogni volta che devo usarlo.
effimero

2
Sono al 100% sugli inizializzatori !!!
Giudice Maygarden,

Se vuoi inizializzare una struttura globale al di fuori di una funzione (quindi non puoi .set _ * ()), C ++ ti costringe a usare la sintassi dell'iniziatore senza nome o a scrivere un costruttore per la tua struttura. Non mi piace nessuna di queste opzioni.
effimero

Ci sono anche VLA in C99 (GCC) che sono molto più facili da lavorare rispetto a std:vector.
Vahid Amiri,

10

Perché per molte attività di programmazione C è più semplice e abbastanza buono. Quando sto programmando programmi di utilità leggeri, in particolare, mi sento come se C ++ volesse che io costruissi un'elegante sovrastruttura per se stessa, piuttosto che scrivere semplicemente il codice.

OTOH, per progetti più complessi, l'eleganza offre un rigore strutturale più solido di quello che fluirebbe naturalmente dalla mia tastiera.


8

La maggior parte delle funzionalità significative di c ++ coinvolge in qualche modo classi o modelli. Queste sono caratteristiche meravigliose, tranne per il modo in cui il compilatore le trasforma in codice oggetto. La maggior parte dei compilatori usa il nome mangling e quelli che non fanno qualcosa di altrettanto disordinato.

Se il tuo sistema vive da solo, come nel caso di molte applicazioni, C ++ è una buona scelta.

Se il tuo sistema deve interagire con un software non necessariamente scritto in C ++ (più frequentemente in assemblatore o nelle librerie Fortran), allora sei in difficoltà. Per interagire con questo tipo di casi, dovrai disabilitare la modifica del nome per quei simboli. questo di solito viene fatto dichiarando quegli oggettiextern "C" , ma poi non possono essere template, funzioni sovraccaricate o classi. Se è probabile che siano l'API delle tue applicazioni, dovrai racchiuderle con le funzioni di supporto e mantenerle sincronizzate con le implementazioni effettive.

E in realtà, il linguaggio C ++ fornisce una sintassi standard per funzionalità che possono essere facilmente implementate in puro C.

In breve, l'overhead del C ++ interoperabile è troppo elevato per essere giustificato dalla maggior parte delle persone.


3
Sono molto sorpreso di sentire questo perché ho scritto così tanti .DLL in C ++ che avevano interfacce "C" esterne in modo che potessero essere chiamate da C o da qualsiasi altro linguaggio CLR. Certamente non puoi semplicemente esporre i puntatori alle funzioni dei membri, ma in realtà non sono molti i dati di marshalling per le chiamate __cdecl.
Crashworks,

1
In realtà, puoi esportare il codice modello. Richiede solo wrapper di funzioni non basati su modelli per ogni tipo che si desidera utilizzare per evitare collisioni di nomi.
Giudice Maygarden,

8

Questo è piuttosto superficiale ma come studente impegnato ho scelto C perché pensavo che C ++ avrebbe impiegato troppo tempo per imparare. Molti professori della mia università non accetteranno incarichi in Python e dovevo raccogliere qualcosa in fretta.


8
Saggio dei tuoi insegnanti!
Andrei Ciobanu,

6

Un'osservazione su "usa solo il sottoinsieme di C ++ che vuoi usare": il problema con questa idea è che ha un costo per imporre che tutti nel progetto utilizzino lo stesso sottoinsieme. La mia opinione è che tali costi sono piuttosto elevati per progetti debolmente accoppiati (ad esempio quelli open source), e anche che C ++ non è riuscito a diventare un C migliore, nel senso che non puoi usare C ++ ovunque tu abbia usato C.


6

Oh mio Dio, C vs C ++, un ottimo modo per iniziare una guerra di fiamma. :)

Penso che C sia migliore per driver e codice incorporato.

C ++ ha alcune grandi funzionalità che C non ha, ma molte delle funzionalità orientate agli oggetti di C ++ possono causare enormi problemi di codifica quando le persone scrivono codice con effetti collaterali non ovvi che si verificano dietro le quinte. Il codice pazzo può essere nascosto in costruttori, distruttori, funzioni virtuali, ... La bellezza del codice C è che il linguaggio non fa nulla di non ovvio alle tue spalle, quindi puoi leggere il codice e non devi cercare ogni costruttore e distruttore e così via. Gran parte del problema sono le cattive pratiche di codifica di ALCUNE persone.

Il mio linguaggio perfetto sarebbe una combinazione di C99 più un sottoinsieme minimo di funzionalità C ++ più sicure che aggiunge l'overhead del compilatore ZERO (o quasi zero) all'output binario. Le aggiunte perfette sarebbero l'incapsulamento di classe e i concetti di denominazione di dati e funzioni.


Denominalo C + o C100: _)
m3nda

4

Non sono stato in grado di trovare molte prove del perché tu voglia scegliere C piuttosto che C ++.

Difficilmente puoi chiamare ciò che sto per dire prova; è solo la mia opinione.

Alla gente piace C perché si adatta perfettamente alla mente del programmatore.

Esistono molte regole complesse di C ++ [quando hai bisogno di distruttori virtuali, quando puoi chiamare metodi virtuali in un costruttore, in che modo il sovraccarico e l'override interagiscono, ...], e per padroneggiarli tutto richiede molto sforzo. Inoltre, tra riferimenti, sovraccarico dell'operatore e sovraccarico della funzione, la comprensione di un pezzo di codice può richiedere la comprensione di altro codice che può essere o non essere facile da trovare.

Una domanda diversa sul perché le organizzazioni preferirebbero il C al C ++. Non lo so, sono solo un popolo ;-)

A difesa del C ++, apporta funzionalità preziose alla tabella; quello che apprezzo di più è probabilmente il polimorfismo parametrico ('ish), comunque: operazioni e tipi che accettano uno o più tipi come argomenti.


2
++score: La tua affermazione " Alla gente piace C perché si adatta perfettamente alla mente del programmatore" è molto ben definita. Essere in grado di programmare in un linguaggio semplice in cui sai che ciò che vedi è ciò che ottieni è una proprietà davvero attraente per un linguaggio di programmazione.
tchrist il

3

Direi che C offre un migliore controllo sull'ottimizzazione e l'efficienza rispetto a C ++ e quindi sarebbe utile in situazioni in cui la memoria e altre risorse sono limitate e ogni ottimizzazione aiuta. Naturalmente ha anche un ingombro minore.


Puoi dare esempi di questi?
Andrew Grant,

Quindi lo stesso codice C compilato usando un compilatore C sarà più efficiente che se compilato usando un compilatore C ++?
Steve Kuo,

1
Anni fa il kernel Linux poteva essere compilato con gcc o g ++, ma g ++ ha creato un codice più lento ( tux.org/lkml/#s15-3 sotto "Infine, mentre Linus mantiene il kernel di sviluppo ...").
Max Lybbert,

Suppongo che stavo pensando di più sulla falsariga di poter controllare di più su come il tuo codice è ottimizzato in C su C ++. Proprio come un programmatore che usa un linguaggio assembly può mettere a punto il proprio codice in modo più preciso di uno che usa un linguaggio di livello superiore.
Chris,

2

C'è anche l'approccio che alcuni negozi adottano nell'usare alcune delle funzionalità del C ++ in modo simile al C, ma evitando quelle che sono discutibili. Ad esempio, l'uso di classi e metodi di classe e sovraccarico di funzioni (che di solito sono facili da affrontare anche per i programmatori C), ma non STL, operatori di streaming e Boost (che sono più difficili da imparare e possono avere cattive caratteristiche di memoria).


1

Perché stai scrivendo per un sistema in cui le risorse sono limitate (come un sistema incorporato o qualche tipo di codice bare metal reale come un kernel) e vuoi il minimo overhead possibile.

C'è un motivo per cui la maggior parte dei sistemi embedded non ha un compilatore C ++ - non è che le persone non ne vogliono uno, è che stipare il codice C ++ in uno spazio così piccolo è un'attività che si avvicina impossibile.


3
Non proprio un problema del linguaggio C ++ stesso come linguaggio, ma può causare il gonfiore patologico che può causare l'uso indiscriminato dei modelli.
Crashworks,

1
ecos è in gran parte scritto in C ++. Non esiste alcuna relazione tra la lingua (rispetto a C) e le dimensioni eseguibili (purché si sappia quali funzionalità utilizzare).
user52875

1
"purché tu sappia quali funzionalità utilizzare". Questo è il punto - il risultato di dire "bene, abbiamo C ++, ma non possiamo sostenere la metà la lingua dispone per ragioni ambientali" è Symbian / C ++, che confonde e fa arrabbiare sia i programmatori C e programmatori C ++ ...
Steve Jessop

1
Concordato su tutti i punti. La nostra soluzione per "sapere quali funzionalità usare" era semplicemente usare un compilatore C e chiamarlo un giorno. Certo, avremmo potuto far funzionare il C ++, (che sarebbe stato davvero divertente in un modo un po 'super-nerd) ma avevamo un prodotto da spedire e non abbiamo avuto il tempo di preoccuparci.
Electrons_Ahoy

1

Ciò di cui C aveva bisogno era un preprocessore migliore. cfront era uno e quindi nato c ++

Vorrei usare C, dove il 'c ++ come preprocessore' non andava bene.

Sono abbastanza sicuro, in fondo a qualsiasi libreria / framework / toolkit c ++ ben scritta, troverai sporco-vecchio-c (o cast statici, che è lo stesso)


0
  • Fino a qualche anno fa i compilatori C ++ esistenti mancavano di funzionalità importanti o il supporto era scadente e le funzionalità supportate variano notevolmente tra loro, quindi è stato difficile scrivere applicazioni portatili.
  • A causa della non standardizzazione dei nomi dei simboli, è difficile per altre lingue / applicazioni supportare direttamente le classi C ++.
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.