Devo smettere di usare il termine C / C ++?

141

Capisco che C e C ++ sono lingue diverse ma quando stavo imparando C ++ mi è sempre stato detto che C è un sottoinsieme di C ++ o C ++ è C con classi. E questo era vero fino all'apparizione di C ++ x0, C ++ 11 (o il moderno C ++ 11/14/17 in generale). Infatti (specialmente quando si lavora su sistemi embedded) è molto probabile trovare codice scritto in C ++ ma con molte parti scritte interamente in linguaggio C puro. Qui ho diverse domande:

  1. Dovrei smettere di usare il termine C / C ++?
  2. Se la risposta al n. 1 è sì, come definirei un programma che utilizza un mix di C e C ++?
  3. Dato che entrambi sono linguaggi 'diversi' è probabile che a un certo punto i compilatori C ++ smettano di supportare il codice scritto nel linguaggio C (dato che il c ++ moderno è divergente dalla mentalità C per elementi di base come i puntatori, gestione dinamica della memoria, etc)
  4. C'è adesso qualche collaborazione tra le persone che rendono gli standard di C / C ++ per mantenere la compatibilità
  5. Se # 4 è sì, tale collaborazione potrebbe finire nel prossimo futuro con l'aspetto di moderno c ++ (11/14/17)

So che ci sono già domande simili, ma sono sicuro che molte persone condividono queste domande quindi sono molto interessato a ottenere buone risposte soprattutto per i punti che hanno a che fare con la tendenza del C ++ nel prossimo futuro .

    
posta rkachach 30.09.2015 - 21:27
fonte

11 risposte

184

C non è mai stato un sottoinsieme di C ++. L'esempio più ovvio di questo è int new; . Questo è vero sin dal C89 e dal C ++ 98, e le lingue sono cresciute ulteriormente l'una dall'altra quando sono emersi nuovi standard.

Should I stop using the term C/C++

Si

If the answer to #1 is yes, how would I call a program that use a mix of C and C++?

Un file sorgente è scritto in una lingua o nell'altra. Un programma può consistere in codice da più lingue che lavorano insieme, o un eseguibile prodotto collegando diversi oggetti compilati. Si direbbe che il programma sia stato scritto in C e C ++, "C / C ++" non è una lingua.

Given that both of them are 'different' languages is it likely that at some point C++ compilers stop supporting code written in the C language

3) Non l'hanno mai fatto. %codice%. C e C ++ non sono mai stati completamente compatibili almeno fino a quando hanno avuto gli standard ISO (non conosco tutti i dettagli sui giorni pre-standardizzati). fai clic sui collegamenti o vedi sotto per un file che va bene con C89 e versioni successive, ma non è valido in nessuno standard C ++.

4) Afaik no, i gruppi di lavoro sono consapevoli l'uno dell'altro, ma gli standard prendono le decisioni migliori per loro stessi.

/* A bunch of code that compiles and runs under C89 but fails under any C++ */

/* type aliases and struct names occupy separate namespaces in C, not in C++ */
struct S { int i; };
typedef int S;


struct Outer { struct Inner { int i; } in; };
/* struct Inner will be Outer::Inner in C++ due to name scope */
struct Inner inner;


/* default return type of int in C, C++ functions need explicit return types */
g() {
    return 0;
}


/* C sees this as two declarations of the same integer,
 * C++ sees it as redefinition */
int n;
int n;


/* K&R style argument type declarations */
void h(i) int i; { }


/* struct type declaration in return type */
struct S2{int a;} j(void) { struct S2 s = {1}; return s; }


/* struct type declaration in argument, stupid and useless, but valid */
/*void dumb(struct S3{int a;} s) { } */


/* enum/int assignment */
enum E{A, B};
enum E e = 1;


void k() {
    goto label; /* C allows jumping past an initialization */
    {
        int x = 0;
label:
        x = 1;
    }
}


/* () in declaration means unspecified number of arguments in C, the definition
 * can take any number of arguments,
 * but means the same as (void) in C++  (definition below main) */
void f();

int main(void) {
    f(1); /* doesn't match declaration in C++ */
    {
        /* new is a keyword in C++ */
        int new = 0;
    }

    /* no stdio.h include results in implicit definiton in C.  However,
     * as long as a matching function is found at link-time, it's fine.
     * C++ requires a declaration for all called functions */
    puts("C is not C++");
    {
        int *ip;
        void *vp = 0;
        ip = vp; /* cast required in C++, not in C */
    }
    return 0;
}

/* matches declaration in C, not in C++ */
void f(int i) { }

Sento sempre che vale la pena ricordare che C è un sottoinsieme di Objective-C.

    
risposta data 30.09.2015 - 21:32
fonte
108

ha è una ragione per cui questi termini si uniscono così spesso. Mentre non dovresti dire al tuo insegnante C che il suo linguaggio è un sottoinsieme di C ++, c'è del vero qui. Altri hanno già esposto il punto di vista del tuo insegnante. Questo è molto bello (e illustrato con esempi, ecc.). Ma noi non viviamo in una torre d'avorio o in un libro.

Al tuo grande capo non potrebbe importare di meno del linguaggio esatto che hai usato. Se conosce un po 'di programmazione, digli che hai usato C / C ++ e suonerà come "Ho usato un linguaggio che deve essere compilato per codice macchina, con DLL e tutte le cose complicate". Questa è la parte "comunicazione esterna".

Se crei una libreria che possa essere interfacciata sia da C che da C ++, la definirai sicuramente come una libreria C / C ++. Certo, qualcuno alzerà una mano e chiederà perché non si chiami una libreria C che ha un wrapper C ++, e comunque C ++ può collegarsi alle librerie C in modo da non doverlo menzionare affatto. Rispondi semplicemente: "Sì, hai ragione, questa è una libreria C / C ++". Questa è la parte "comunicazione interna".

Se crei un analizzatore lessicale per C ++, rimarrai sorpreso dal modo in cui funziona con C. Potresti persino non aver bisogno di modificare tutto. Questo è "se sembra un'anatra, ecc." parte.

Etc.

La maggior parte dei programmi C che abbia mai visto compilare (e lavorare) senza modifiche come codice C ++. Non lasciare che alcune eccezioni o programmatori dogmatici (comunque influenti) ingannino la tua intuizione. C e C ++ sono così vicini, e così spesso compatibili, e così spesso mescolati e abbinati, che viene usato il termine C / C ++. Viene usato perché è utile descrivere questo tipo di situazioni in cui non importa se stai considerando C o C ++, purché non sia Java o PHP . Sappiamo che è "sbagliato", ma non ci interessa, è più utile che sbagliato.

Può essere abusato, può essere stupido, ma comunque, non sono sicuro di quale vantaggio otterrai essendo più pedante del necessario e rifiuto di comunicare in termini che gli altri capiscono. Se ti senti a disagio in qualche situazione specifica, semplicemente non usare il termine generico C / C ++, ma quello relativo al caso (C o C ++).

Non aver paura del futuro. I nostri sistemi operativi sono scritti in C. Molto spesso la produzione di software corrente C / C ++ avviene in C ++. Questa coppia è qui per rimanere per un bel po '. Nessuno ha interesse per uno essere reso più incompatibile con l'altro (al contrario, in realtà).

Per essere precisi sui tuoi punti:

1) Dipende. Sì, quando potrebbe portare a una confusione, quando ti senti a disagio o quando è semplicemente sbagliato o fuori dal contesto. No quando pensi che sia adeguato.

2) N / A

3) Penso di no, ma non ho la sfera di cristallo.

4) nessuna idea

5) Io non la penso così come nulla spinge in questa direzione

    
risposta data 01.10.2015 - 01:03
fonte
42

Contro il flusso direi dipende dal contesto .

Il termine "C / C ++" di solito non è appropriato quando si dice qualcosa come "questo è un programma C / C ++", ma questo è stato esplorato in profondità in altre risposte.

Tuttavia, potrebbero esserci contesti in cui C / C ++ può essere appropriato.

  • Ci sono varie librerie che di solito hanno sia un'AP che una C ++. Immagino che non sia lontano dal vero se chiami una cosa come una libreria C / C ++. A noi umani piace comprimere le informazioni, quindi dire "opencv è una libreria C / C ++" è breve, chiaro e comprensibile, confrontalo con "opencv è una libreria, che viene fornita con intestazioni sia per C che per C ++".
  • Puoi parlare di design della lingua e sintassi. Dal punto di vista della sintassi del linguaggio, si potrebbe dire che una lingua ha una sintassi simile a C / C ++.
  • Organizza un concorso di codifica e accetti entrambe le soluzioni scritte in C e in C ++
  • Stai assumendo un nuovo programmatore e la maggior parte delle attività sarà C o C ++, quindi il programmatore dovrebbe conoscere entrambe le lingue. È comune nello sviluppo embedded, dove C è più adatto per alcuni (di solito molto piccoli) microcontrollori e C ++ per gli altri. In questo caso potresti dire che stai cercando un programmatore C / C ++.
risposta data 01.10.2015 - 08:15
fonte
30

In general the SO users ask the person who is asking the question to choose a language: C or C++. Why?

Ci sono molte sottili differenze tra C e C ++. Ad esempio, in C ++, una variabile const all'ambito globale ha un collegamento interno a meno che non sia stato dichiarato extern , ma in C ha un collegamento esterno a meno che non sia dichiarato static . Dicendo "C / C ++", l'OP sta affermando che la risposta alla loro domanda è la stessa sia in C che in C ++, quando potrebbe benissimo non esserlo. Questo rende inutilmente le cose più difficili per i potenziali rispondenti.

  • A volte possiamo notare che il codice non è valido in una lingua o nell'altra (ad esempio, conversioni implicite da void* a puntatore a oggetto non sono valide in C ++). Questo è fastidioso. Perché stai dicendo "C / C ++" quando hai un pezzo di codice valido in C ma non in C ++? Hai inteso C, o si tratta solo di un errore nel codice destinato a essere C ++?

  • A volte la risposta sarà diversa a seconda della lingua (ad esempio, gli array a lunghezza variabile esistono in C99 ma non in C ++). Se non sappiamo di quale lingua stai parlando, o dobbiamo indovinare o scrivere una risposta per entrambi quando solo uno sarà effettivamente utile, perché tu sai quale lingua stai effettivamente usando; non ci stai dicendo!

  • A volte la risposta è la stessa per entrambe le lingue, ma è difficile esserne certi. Ad esempio, penso che C e C ++ abbiano le stesse regole di conversione dei numeri interi, ma per essere davvero, davvero sicuro, devo leggere attentamente entrambi gli standard. Ancora una volta, questo mi fa fare il doppio del lavoro necessario quando probabilmente ti interessa solo una delle lingue.

In ogni caso, per rispondere alle altre domande:

  1. Sì.

  2. Se si collegano insieme codice C e C ++, è accettabile utilizzare entrambi i tag, ma si prega di specificare in quale lingua è presente ciascun file.

  3. A volte ci sono cambiamenti di rottura, ma sono rari e in genere limitati nell'impatto (altrimenti non vengono approvati). Ad esempio, auto in C ++ 11.

  4. Non penso che collaborino direttamente, ma prestano attenzione agli sviluppi nell'altra lingua e cercano di evitare di introdurre modifiche che renderebbero la compatibilità più difficile.

E se davvero vuoi sapere di entrambe le lingue, va bene, e puoi dirlo nella tua domanda. Quando dici "C / C ++", non sono davvero sicuro di cosa intendi, e sembra davvero che tu stia facendo un'ipotesi sulle due lingue.

    
risposta data 30.09.2015 - 22:53
fonte
18

I was always told that C is a subset of C++ or C++ is C with classes. And that was quiet true until the appearance of C++x0, C++11 (or the modern C++ 11/14/17 in general).

C non è mai stato un sottoinsieme di C ++. Ad esempio C89 non è un sottoinsieme di C ++ 98.

Alcuni esempi:

  • il modulo identificatore-elenco di C89 per la dichiarazione dei parametri di funzione non è supportato in C ++
  • C89 e C ++ 98 hanno tipi diversi per le costanti di caratteri
  • C89 e C ++ 98 hanno tipi diversi per i letterali stringa
  • operatori logici producono tipi diversi in C89 e C ++ 98 ( int vs bool )
  1. Should I stop using the term C/C++?

Sì.

  1. If the answer to #1 is yes, how would I call a program that use a mix of C and C++?

Un programma è C o C ++ (anche se alcuni programmi di base possono essere compilati con un compilatore C o C ++). Quale compilatore stai usando per compilarlo? Dovrebbe rispondere alla tua domanda. Harbison & Steele ha coniato il termine Clean C per designare un sottoinsieme comune di C e C ++ ma penso che sia stata una cattiva idea.

EDIT : Tuttavia ammetto che tecnicamente è possibile collegare file di oggetti C e C ++ in un singolo programma, ma OTH ci sono molti linguaggi che possono essere mescolati in un singolo programma, ad esempio Java e C ++ . Penso che usare il termine C / C ++ aggiunga solo alla confusione che è scritto in un singolo linguaggio chiamato C / C ++.

  1. Given that both of them are 'different' languages is it likely that at some point C++ compilers stop supporting code written in the C language (since modern c++ is diverging from the C mentality for basic stuff like pointers, dynamic memory handling, etc)

Ci sono molte caratteristiche (esempio: array di lunghezza variabile, membro di array flessibile, _Generic , ...) di C99 o C11 che non sono supportati da alcuna versione C ++.

    
risposta data 30.09.2015 - 21:32
fonte
16

Alcuni programmi sono scritti in un misto di C e C ++

Questo è solo un fatto della vita. È possibile compilare file oggetto da C e C ++ e collegarli tra loro. Il risultato può essere ragionevolmente chiamato "un programma C / C ++".

Ma questo è solo il programma nel suo insieme. E le singole unità di compilazione?

Esiste un sottoinsieme di C che è anche un sottoinsieme di C ++

Un programma (o unità di compilazione) scritto in quel sottoinsieme compilerà e si comporterà allo stesso modo con compilatori C e C ++ conformi. Un tale programma o file può essere giustamente chiamato "un programma C / C ++" o "un file C / C ++".

Un programma parziale come un file di intestazione può anche essere usato in entrambi i programmi C e C ++. Tali file di intestazione possono essere correttamente definiti come intestazioni C / C ++.

Citazione del Professor Bjarne Stroustrup:

Is C a subset of C++?

In the strict mathematical sense, C isn't a subset of C++. There are programs that are valid C but not valid C++ and even a few ways of writing code that has a different meaning in C and C++. However, C++ supports every programming technique supported by C. Every C program can be written in essentially the same way in C++ with the same run-time and space efficiency. It is not uncommon to be able to convert tens of thousands of lines of ANSI C to C-style C++ in a few hours. Thus, C++ is as much a superset of ANSI C as ANSI C is a superset of K&R C and much as ISO C++ is a superset of C++ as it existed in 1985.

Well written C tends to be legal C++ also. For example, every example in Kernighan & Ritchie: "The C Programming Language (2nd Edition)" is also a C++ program.

Quindi esiste una cosa come C / C ++. È tutto ciò che è sia C valido che C ++ valido.

Il pre-processore C fa parte del linguaggio C. Il pre-processore C ++ fa parte del linguaggio C ++

Puoi scrivere un'unità di compilazione che verrà compilata in C o C ++ ed essere diversa . Ad esempio, potrebbe avere una funzionalità di base compilata in C ma usufruire di una libreria C ++ se compilata in C ++.

Se il programma è essenzialmente lo stesso, ma con funzionalità aggiuntive, non è esattamente sbagliato dire che è lo stesso programma. È lo stesso, ma anche diverso.

La maggior parte dei programmatori C può fare almeno un piccolo C ++ e viceversa

Non è irragionevole chiamare tale persona un programmatore C / C ++. Sì, probabilmente si specializzano in uno, ma c'è qualcuno che è un programmatore C o C ++ competente che letteralmente non può fare alcun dell'altro linguaggio? In un certo senso, non sono loro tutti programmatori C / C ++?

Non c'è niente di sbagliato nel dire "C / C ++". Ciò che conta è essere compreso

La lingua inglese non è uno strumento per esprimere sillogismi . puoi usare l'inglese per la logica, ma solo e con grande sforzo.

Questo perché le parole non hanno naturalmente significati esatti, ma piuttosto una vaga nuvola di denotazioni e connotazioni. Ciò che conta è che la gente capisca cosa stai dicendo.

    
risposta data 01.10.2015 - 12:07
fonte
15
  1. Should I stop using the term C/C++?

Assolutamente. Non è chiaro che cosa intende esprimere questo costrutto, tranne, forse, la confusione su cosa siano C e C ++ per conto della persona che usa il termine.

Poiché questa confusione è una fonte comune di frustrazione, molte persone sono diventate piuttosto emotive e l'aspetto di quel termine da solo sarà una ragione sufficiente per far sì che diventino negativi riguardo al tuo contributo. Questo potrebbe sembrare sciocco, ma sembra essere quello che abbiamo.

Raccomando che invece di parlare di "C / C ++" usi un termine che in realtà chiarisca cosa intendi.

  • Se stai parlando di qualcosa in C che potrebbe o potrebbe anche non essere vero per C ++, dì semplicemente C .

    Example: How should the main function be declared in C?

    At first, it might seem that the answer for C++ is the same: int main() or int main(int, char**). But as the discussion goes on, it might be relevant to point out that in C++, the function has to be declared at global scope, which doesn't make sense in C, because it has no namespaces. On the other hand, C allows calling main recursively while C++ doesn't. In C++, there is an implicit return 0; if you “fall off” main but in C the return statement is required on any path. The list goes on and it makes the discussion much simpler if you make it clear up front what the language to be discussed is.

  • Se stai parlando di qualcosa in C ++ che potrebbe anche non essere vero per C, dì semplicemente C ++ .

    Example: Will a malloc()ed array of ints initially be all-zeros in C++?

    The short answer for C happens to be the same: no. But as the answer goes on, it might be worthwhile to point out that in C, calloc would be a good alternative while in C++, using a std::vector<int> might have been a better choice in the first place.

  • Se vuoi segnalare una somiglianza tra C e C ++, dì C e C ++ .

    Example: In C and C++, the sizeof an int is implementation defined and may vary between compilers and architectures.

    Here, we want to point out that C and C++ behave the same way. We are explicitly talking about both languages.

In realtà ti raccomando di essere ancora più specifico e non solo parlare di "C" o "C ++" ma della versione precisa. Entrambe le lingue si stanno evolvendo e un'affermazione blunt come

C++ supports /* … */ and // … comments while C only supports the /* … */ style.

non è giusto né sbagliato.

  1. If the answer to #1 is yes, how would I call a program that use a mix of C and C++?

Poiché le lingue si sovrappongono, ogni programma C conterrà parti che potrebbero sembrare C ++ e viceversa. Ciononostante, gli autori si saranno probabilmente basati su un compilatore C o C ++. Quindi dì "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 rifiutarsi di utilizzare qualsiasi funzionalità C ++ moderna. Alcune persone si riferiscono a tale codice C ++ come C-style C ++ . Assenza di sovraccarico, eccezioni, polimorfismo, modelli e flussi 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 insieme, I direi che "il programma è scritto in un mix di C e C ++ " come, infatti, lo hai già fatto.

Tuttavia, se, invece, gli autori si sono premurati di scrivere ogni singolo file in modo tale da poterlo compilare con un compilatore C o e il programma risultante farebbe il stessa cosa, si potrebbe dire che "il programma è scritto in un sottoinsieme comune di C e C ++ ".

Quest'ultimo è spesso il caso per i file di intestazione che dovrebbero essere condivisi tra codice C e C ++. A proposito, scrivere questo codice non è semplice. Se si desidera sottolineare ulteriormente che sono stati utilizzati solo tali costrutti validi in C e C ++ e sono ampiamente supportati da diversi produttori di compilatori, il termine a portatile comune sottoinsieme di C e C ++ può essere usato per sottolineare questo.

  1. Given that both of them are “different” languages is it likely that at some point C++ compilers stop supporting code written in the C language (since modern C++ is diverging from the C mentality for basic stuff like pointers, dynamic memory handling, etc)?

Non sono sicuro di aver capito questa domanda. Poiché C e C ++ sono lingue diverse, non ci si può aspettare che un compilatore per uno di essi 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 loro vuoi tramite un interruttore a riga di comando o mezzi simili.) Finché entrambe le lingue saranno ampiamente utilizzate, sembra molto improbabile che questo cambierà. Il vostro punto sul "moderno C ++" penso che sia fondamentalmente una questione di buoni standard di codifica e della libreria standard. Dal punto di vista del compilatore , l'evoluzione di entrambe le lingue è piuttosto convergente che divergente.

  1. Is there right now any collaboration between the people who make the standards of C/C++ to keep the compatibility?

Sì. Il modello di memoria e la libreria di operazioni atomiche introdotte in C ++ 11 e C11 sono un buon esempio. Sembra che i progettisti di entrambi i linguaggi si rendano conto che la compatibilità è importante e stanno lavorando per migliorarla. Personalmente, mi piacerebbe che la collaborazione fosse più intensa e forse i due gruppi di lavoro ISO si sono uniti, 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 Il linguaggio di programmazione C ++ che, ironia della sorte, si intitola "Compatibilità C / C ++" . In questo caso l'uso del termine potrebbe essere appropriato in quanto è chiaro che cosa si intende.

  1. If #4 is yes, such collaboration could end up in the near future with the appearance of the modern C++ (11/14/17)

Come discusso in precedenza, è successo in C ++ 11 e si aspetta / spera / deve succedere di nuovo.

    
risposta data 01.10.2015 - 01:24
fonte
5

C / C ++ è l'intersezione di C e C ++.

int new; non è C / C ++ e nessuno dei due è vector<int> foo; .

Allo stesso modo, C89 / C99 è l'intersezione di queste due lingue, dove né enum bool { false, true };for(int i = 0;;) è consentito.

E C ++ 11 / C ++ 14, ecc.

È possibile scrivere codice che compila (e gira correttamente) in C ++ 11 e C ++ 14, anche se la compilazione sotto uno non implica che compili sotto l'altro. In effetti, molte persone lo fanno.

E molte persone scrivono il codice che funziona in C e C ++.

Ovviamente, maggiore è la sovrapposizione, più senso ha; Non mi aspetto di vedere alcuna domanda sul codice C / C ++ / Java.

Anche se "ha senso" per parlare di un sottoinsieme comune di queste lingue, molte domande non avranno risposte in questo sottoinsieme, ad es. Cosa dovrebbe restituire main () in C e C ++?

Ma puoi parlare di codice che funziona per specifiche di più lingue, indipendentemente dal fatto che tali specifiche siano differenziate per "versione" o "nome della lingua" o altro.

    
risposta data 01.10.2015 - 18:30
fonte
3

Questa è una risposta di sorta alla posizione secondo cui "questo è un codice per i programmatori che lavorano vicino al metallo e va bene in un contesto di gestione" visto in alcune delle altre risposte e commenti.

Direi che anche questa interpretazione dovrebbe essere presa con cura.

A partire dalla metà degli anni '90, se volevi un programmatore C ++ e qualcuno che si descriveva come programmatore C, avresti dovuto chiedere quanto ne sanno di design orientato agli oggetti, quanta esperienza hanno con il debugging in un contesto orientato agli oggetti e sulla loro capacità di utilizzare le librerie di modelli. Vorresti sondare esattamente questi problemi durante il colloquio e il processo di assunzione.

Il rovescio della medaglia è ormai da più di un decennio da quando i guru del C ++ hanno iniziato a spingere "C ++ moderno", il che significa enfatizzare il passaggio dai puntatori nudi agli oggetti puntatori più sicuri e agli idiomi basati su iteratore. Con l'emergere di C ++ 11 ora esiste un supporto esplicito per la programmazione multi-paradigma e la spinta verso il codice che non mostra puntatori nudi è molto strong. Ciò significa che se oggi avessi intervistato un programmatore C ++ per una posizione in C, sarei molto preoccupato di verificare la familiarità di questa persona con i puntatori effettivi, abilitati per il tiro dei piedi.

Non sono al lavoro in questi giorni (anche nella misura in cui lo ero quando Stack Overflow era nella sua infanzia), quindi non avventurerò un'ipotesi su quanto spesso l'intervistato immaginario non avrebbe il crossover competenze, ma penso che, come più spesso applicate, le lingue siano ora molto diverse.

In breve "C / C ++" dovrebbe essere abbandonato non solo nei contesti tecnici ma anche nella maggior parte dei contesti aziendali.

    
risposta data 04.10.2015 - 23:06
fonte
2

La risposta più semplice a questa domanda è che dovresti mai aver usato quel termine. È un termine che non dovrebbe esistere. Non ha significato. Ogni programma è C o C ++.

And that was quiet true until the appearance of C++x0, C++11 (or the modern C++ 11/14/17 in general).

C ++ 98 e 03 non sono neanche lontanamente C con Classi. Chi ti ha insegnato questo non sa la merda e puoi dimenticarli. Questo non è mai stato corretto.

    
risposta data 30.09.2015 - 23:44
fonte
1

Concettualmente, non dovrebbero esserci particolari difficoltà nel progettare i file sorgente C in modo che possano essere compilati così come sono con C ++. In effetti, possono esserci alcuni vantaggi significativi. Ad esempio, quando si scrive un codice per un sistema incorporato, talvolta è utile essere in grado di testare il codice su un ambiente PC ospitato. Se il codice viene compilato in modo pulito come C ++, è possibile avere un'istruzione come "MOTOR_ENABLE = 1;" scrivere su un bit I / O volatile sul sistema embedded (compilato come C), ma attivare la logica di emulazione sul PC (compilando come C ++). Probabilmente sarebbe anche possibile progettare un tipo C ++ sul PC che si comporterebbe come un uint16_t si comporta su sistemi embedded più piccoli (in modo che, ad esempio, dato u16 x=65533; , un compilatore dovrebbe considerare il valore di x*x come nove, piuttosto che avere il regno libero per fare tutto ciò che vuole), anche se nessuno dei miei emulatori ha incluso quello [in parte perché i compilatori C ++ che ho usato non hanno fatto niente di strano in questi casi].

Sfortunatamente, i programmatori C e i programmatori C ++ hanno un'antipatia sufficiente nei confronti dell'altra che le lingue, nel corso degli anni, si sono evolute in modi compatibili. Mentre C89 ha tentato di adattare alcune delle più utili funzionalità del C ++ (come i prototipi di funzione) sembra essere emerso un atteggiamento che i programmatori che desiderano utilizzare qualsiasi caratteristica di C ++ utilizzino il C ++, ignorando il fatto che ci sono molte situazioni in cui essere utile per utilizzare alcune delle funzionalità di C ++ (ad esempio, la capacità di sovraccaricare le funzioni con collegamento statico o statico inline senza dover accettare i costi associati ad altre funzionalità di cui non si ha bisogno ( ad esempio il nome mangling associato all'esportazione di funzioni sovraccariche).

Mentre l'intersezione di C89 e C ++ 98 è un linguaggio praticabile, il superset utilizzabile delle versioni successive di C con versioni successive di C ++ è probabilmente ridotto piuttosto che cresciuto (grazie a regole come la regola di aliasing rigoroso) e favorisce le tendenze una fessura sempre crescente.

    
risposta data 02.10.2015 - 01:27
fonte

Leggi altre domande sui tag