- Dovrei smettere di usare il termine C / C ++?
Assolutamente. Non è chiaro che cosa intenda esprimere questo costrutto se non, forse, la confusione su ciò che C e C ++ sono per conto della persona che usa il termine.
Dal momento che questa confusione è una fonte di frustrazione così comune, molte persone sono diventate abbastanza emotive al riguardo e l'apparizione di quel solo termine sarà una ragione sufficiente per diventare negativi sul tuo contributo. Questo potrebbe sembrare sciocco ma sembra essere quello che abbiamo.
Raccomando che invece di parlare di "C / C ++" usi un termine che chiarisca effettivamente cosa intendi.
Se si sta parlando di qualcosa in C che potrebbe o non potrebbe essere vero anche per C ++, semplicemente dire C .
Esempio: come deve main
essere dichiarata la funzione in C?
All'inizio, potrebbe sembrare che la risposta per C ++ sia la stessa: int main()
o int main(int, char**)
. Ma mentre la discussione prosegue, potrebbe essere rilevante sottolineare che in C ++, la funzione deve essere dichiarata in ambito globale, il che non ha senso in C, perché non ha namespace
s. D'altra parte, C consente di chiamare main
ricorsivamente mentre C ++ no. In C ++, c'è un implicito return 0;
se si "cade", main
ma in C l' return
istruzione è richiesta su qualsiasi percorso. L'elenco continua e rende la discussione molto più semplice se si chiarisce in anticipo quale sia la lingua da discutere.
Se stai parlando di qualcosa in C ++ che potrebbe o non potrebbe essere vero anche per C, dì semplicemente C ++ .
Esempio: un malloc()
array ed di int
s inizialmente sarà tutto zero in C ++?
La risposta breve per C sembra essere la stessa: no. Ma man mano che la risposta prosegue, potrebbe essere utile sottolineare che in C, calloc
sarebbe una buona alternativa mentre in C ++, l'utilizzo di a std::vector<int>
potrebbe essere stata una scelta migliore in primo luogo.
Se si desidera sottolineare una somiglianza tra C e C ++, dire C e C ++ .
Esempio: in C e C ++, sizeof
an int
è definita dall'implementazione e può variare tra compilatori e architetture.
Qui, vogliamo sottolineare che C e C ++ si comportano allo stesso modo. Stiamo parlando esplicitamente di entrambe le lingue.
In realtà ti consiglio di essere ancora più specifico e non solo di parlare di "C" o "C ++", ma della versione precisa. Entrambe le lingue si stanno evolvendo e una dichiarazione schietta come
C ++ supporta /* … */
e // …
commenta mentre C supporta solo lo /* … */
stile.
non è né giusto né sbagliato.
- Se la risposta al n. 1 è sì, come potrei chiamare un programma che utilizza un mix di C e C ++?
Poiché le lingue si sovrappongono, ogni programma C conterrà parti che potrebbero apparire come C ++ e viceversa. Tuttavia, gli autori probabilmente avranno optato per l'uso di un compilatore C o C ++. Quindi dite "il programma è scritto in C " se è compilato con un compilatore C e "il programma è scritto in C ++ " se usano un compilatore C ++, anche se potrebbero rifiutare di utilizzare qualsiasi funzionalità C ++ moderna. Alcune persone si riferiscono a tale codice C ++ come stile C C ++ . L'assenza di sovraccarico, eccezioni, polimorfismo, modelli e flussi di I / O sono caratteristiche comuni di tale codice.
Se, invece, alcuni file sono scritti in C e compilati con un compilatore C e alcuni altri file sono scritti in C ++ e compilati con un compilatore C ++ e quindi i file oggetto collegati tra loro, direi che "il programma è scritto in un mix di C e C ++ ”come, in effetti, hai già fatto.
Tuttavia, se invece gli autori si prendessero molta cura di scrivere ogni singolo file in modo tale da poterlo compilare con un compilatore C o C ++ e il programma risultante farebbe la stessa cosa, si potrebbe dire che "il programma è scritto in un sottoinsieme comune di C e C ++ ”.
Quest'ultimo è spesso il caso dei file di intestazione che dovrebbero essere condivisi tra il codice C e C ++. Scrivere un tale codice non è facile, comunque. Se si desidera sottolineare ulteriormente che sono stati utilizzati solo tali costrutti validi in C e C ++ e ampiamente supportati da diversi produttori di compilatori, il termine un sottoinsieme comune portatile di C e C ++ può essere utilizzato per enfatizzare questo aspetto.
- Dato che entrambi sono linguaggi "diversi", è probabile che a un certo punto i compilatori C ++ smettano di supportare il codice scritto nel linguaggio C (dal momento che il C ++ moderno si discosta dalla mentalità C per cose di base come puntatori, gestione dinamica della memoria, ecc.)?
Non sono sicuro di aver capito questa domanda. Poiché C e C ++ sono lingue diverse, non ci si può aspettare che un compilatore accetti un programma scritto per l'altro. Tuttavia, i compilatori sono spesso progettati in modo modulare e se un compilatore ha un front-end C ++ , è probabile che abbia anche un front-end C. (Dovresti quindi selezionare quale di questi desideri tramite un interruttore della riga di comando o mezzi simili.) Finché entrambe le lingue saranno ampiamente utilizzate, sembra molto improbabile che questo cambi. Il tuo punto sul "C ++ moderno" credo sia fondamentalmente una questione di buoni standard di codifica e di libreria standard. Dal punto di vista del compilatore , l'evoluzione di entrambe le lingue è piuttosto convergente che divergente.
- Esiste attualmente una collaborazione tra le persone che stabiliscono gli standard di C / C ++ per mantenere la compatibilità?
Sì. Il modello di memoria e la libreria delle operazioni atomiche introdotti in C ++ 11 e C11 ne sono un buon esempio. Sembra che i progettisti di entrambe le lingue si rendano conto che la compatibilità è importante e stanno lavorando per migliorarla. Personalmente, vorrei che la collaborazione fosse più intensa e che forse i due gruppi di lavoro ISO si unissero, ma i miei desideri non sono importanti.
Bjarne Stroustrup parla delle differenze e dei punti in comune tra le varie versioni di C e C ++ nel § 44.3 della 4a edizione di The C ++ Programming Language che, ironicamente, si intitola "Compatibilità C / C ++". L'uso del termine potrebbe effettivamente essere appropriato in questo caso in quanto è chiaro cosa si intende.
- Se il numero 4 è sì, tale collaborazione potrebbe finire nel prossimo futuro con l'apparizione del moderno C ++ (14/11/17)
Come discusso in precedenza, è successo in C ++ 11 ed è previsto / sperato / necessario che accada di nuovo.