È buona abitudine usare le espressioni C nel codice C ++?

19

A scuola abbiamo iniziato a studiare C quest'anno, nonostante io sia molto più avanti della lezione, e ho imparato Java, C ++ e C mentre la classe è alla base di C. In ogni caso, mi sono documentato, leggendo libri, articoli e ho chiesto al mio insegnante perché dovrei imparare C, e lei ha detto che era la base del C ++. Quando ho iniziato a programmare ho trovato C ++ molto più semplice, in seguito ho imparato C. Ma nei libri puoi vedere che il codice C funziona in C ++ eppure non va viceversa.

La mia domanda è piuttosto semplice ~ È una buona abitudine usare le espressioni C in C ++? Lasciatemi fare un esempio:

Dovrebbe questo codice

#include <stdio.h>
#include <iostream>

int main() {
int x;
scanf("%d", &x);
cout << "The number you entered is " << x << "And it's double is " << x*x;
return 0;
}

Sii più efficiente o migliore in qualsiasi modo:

#include <iostream>

int main() {
int x;
cin >> x;
cout << "The number you entered is " << x << "And it's double is " << x*x;
return 0;
}

Ho già fatto una semplice documentazione su questo in alcuni vecchi libri polverosi, e da quello che ho potuto trovare, usando scanf invece di cout scarica anche lo stream o qualcosa del genere, quindi sostanzialmente sto chiedendo se è meglio usare scanf e in quali contesti.

Questo vale anche per il file IO, in quanto ho sempre trovato che FIle IO è più semplice in C che in C ++. Questa domanda vale praticamente per ogni espressione generale in C applicata a C ++. È anche degno di nota il fatto che io stia usando un compilatore moderno e tuttavia ciò non dovrebbe avere importanza, come sto chiedendo se è una buona abitudine di programmazione usare le espressioni C nel codice C ++.

Probabilmente ci sono pro e contro, ma sto solo cercando un sì / perché, no / perché tipo di risposta.

Inoltre, se ci sono dei dettagli che ho omesso di postare un commento.

    
posta Bugster 13.02.2012 - 21:49
fonte

6 risposte

36

No, è una brutta abitudine. Quando lo fai per vivere, probabilmente finirai per violare le guide di stile a cui il tuo team aderisce (o almeno a farsi scocciare durante le revisioni del codice).

Sì, funziona, ma se esiste un equivalente c ++, usalo. (ad esempio, prova a non mescolare printfs con couts )

    
risposta data 13.02.2012 - 22:00
fonte
20

In generale, C e C ++ vengono considerati come se fossero due lingue completamente separate. Pertanto, potrebbe essere considerata una cattiva forma utilizzare la sintassi C in un programma C ++.

Hai ragione; tuttavia, il codice C verrà compilato correttamente. Dipende davvero da quanto sia flessibile la tua azienda in termini di standard seguenti. Se mai avessi fatto la domanda in un'intervista, sarei sicuro di far sapere all'intervistatore che C funziona in C ++, ma anche che C e C ++ sono due lingue separate e probabilmente non dovrebbero essere mischiati a meno che non ci fosse un molto, molto buon motivo per farlo.

Un'altra cosa da considerare è che gli standard aiutano a creare una piattaforma in cui più persone possono facilmente lavorare con il codice. Mentre sei stato fortunato ad avere un insegnante che ti ha incoraggiato ad imparare C, non tutti possono essere altrettanto fortunati. Pertanto, mescolare C in un programma C ++ potrebbe essere fonte di confusione per qualcuno che non aveva mai imparato C.

In sintesi, solo perché puoi fare qualcosa non significa che dovresti, e solo perché non dovresti fare qualcosa non significa che non puoi:)

    
risposta data 13.02.2012 - 21:58
fonte
10

C ++ è retrocompatibile con C di progettazione, quindi il codice C di solito verrà compilato dal compilatore C ++ bene ( di solito perché ci sono parole riservate aggiuntive in C ++ che sono non in C, e potrebbe essere usato nel codice C rompendo la compilazione).

Tuttavia, lo vedo come una cattiva pratica che mescola il codice. Se utilizzi scanf , utilizza printf , se stai utilizzando operator >> , utilizza operator << . Il motivo è che gli operatori C ++ sovraccarichi potrebbero incapsulare funzionalità di cui non si è a conoscenza e la mancata corrispondenza tra loro farà sì che il programma esegua cose che non si desidera che faccia.

Non c'è alcun motivo particolare per preferire la sintassi C nel codice C ++, questi sono linguaggi diversi e quando si utilizza la sintassi C in codice C ++ - si sta ancora scrivendo il codice C ++ , semplicemente non usando molti dei suoi strumenti potenti.

    
risposta data 13.02.2012 - 21:59
fonte
9

Se mettiamo da parte lo stile di codifica e le questioni estetiche, ci sono anche vari problemi tecnici che devi affrontare quando usi C in codice C ++:

  • Che cos'è C? C90, C99 o C11? Potrebbero esserci vari problemi di compatibilità a seconda dello standard C in uso. Tipo booleano, // commenti, funzioni C99 come VLA, inizializzatori designati ecc.

  • C ++ ha una tipizzazione più rigida di C. Per compilare il codice C in C ++, è molto probabile che vengano aggiunti vari tipi di caratteri per ottenere il tipo previsto. Ciò significa che potresti dover riscrivere perfettamente il codice C di qualità di produzione per farlo funzionare in C ++.

  • I typecasts enfored da una tipizzazione più rigida sono generalmente solo una buona cosa, ma in alcuni casi possono introdurre o nascondere bug. Prendi come esempio il cast infame del risultato di malloc (). Questo dovrebbe essere tipizzato in C ++, ma mai in C. (1)

  • La combinazione di funzionalità C e C ++ può portare a bug e comportamenti indefiniti. Ad esempio, non funzionerà per allocare con malloc () e liberare con delete . (2)

  • Problemi di sicurezza dei thread. La libreria standard C non è thread-safe. La libreria standard C ++ può essere o meno thread-safe, se lo è, quindi aggiungere le chiamate di funzioni della libreria C al tuo codice lo distruggerà.

    Come sidenote per i programmatori di Windows: il compilatore di Visual C ++ aveva un bug di perdita per un po 'di tempo, quando la funzione CreateThread () dell'API di Windows veniva utilizzata nello stesso programma della libreria C. (3, 4)

  • La convocazione della convenzione potrebbe essere un problema su alcuni compilatori, costringendone uno a usare extern "C" per indicare esplicitamente quali funzioni dovrebbero essere collegate alla "convenzione di chiamata C".

  • Dettagli fastidiosi. L'operatore virgola si comporta diversamente. La virgola finale nelle dichiarazioni struct / enum è consentita in C99 / C11 ma non in C ++. L'ambito di vari tipi di variabili e funzioni sono trattati in modo diverso. Ecc ecc.

Probabilmente ci sono ancora più casi.

References:

  1. link
  2. link
  3. link
  4. link
risposta data 14.02.2012 - 15:22
fonte
7

Il motivo per cui C ++ può compilare C è solo per "retrocompatibilità" (evitare di riscrivere codice funzionante esistente).

Ma C ++ ha una filosofia diversa rispetto a c. Mescolarli non è un buon servizio per entrambi.

Il modo in cui C e C ++ gestiscono l'I / O può fare affidamento su un modo diverso di gestire lo stato interno dell'I / O. Quindi, utilizza sempre meno input e output in modo coerente.

E nei programmi C ++ rispettano lo stile C ++ (a meno che non sia specificamente richiesto di fare altrove)

    
risposta data 13.02.2012 - 22:06
fonte
5

Direi che imparare prima C è, IMHO, una buona idea. In questo modo le persone iniziano a capire l'hardware per cui scrivono il software.

Combinare queste due lingue non è comunque una buona idea. Perché ottieni la folle complessità del C ++ accoppiato con il bit twiddling raw comune a C.

Come puoi vedere, anche in un esempio così semplice come il tuo, vi sono problemi di sincronizzazione con diversi tipi di flussi e buffering interno. Ma anche l'approccio C & C ++ non è più flessibile in alcun modo. Passa alla classe x e non ci sono operatori per utilizzare lo streaming e altro.

È complicato ...

Penso davvero che un buon programmatore C ++ dovrebbe sapere come i bit sono capovolti dietro ogni costrutto, e quali sono i comportamenti nascosti.

Ma l'apprendimento del C ++, almeno per più del 50%, richiede più di 5 anni di codifica professionale, e non è possibile gestirlo nel programma di sei mesi con 20 ore di esperienza pratica.

Se usassi i costrutti C ++ in C, non userei gli stream, sono semplici da guardare da un punto di vista generale e far credere che lo sviluppo del software sia facile, ma nascondere complessità extra senza troppi benefici in molti situazioni.

Classi wrapper RAII, template, overload, correttezza const e pure classi astratte per interfacce comuni (non usare il modo Java f-ng qui PER FAVORE!) sono comunque dei buoni candidati. Perché aggiungono sicurezza, generalità e facilità d'uso che sono molto importanti per i progetti di vita reale. Assicurati di ricordare anche cose come la distruzione virtuale, la natura esplosiva della costruzione di copie di default, il sovraccarico di runtime, la correttezza delle costanze ecc. Anche qui.

    
risposta data 13.02.2012 - 23:10
fonte

Leggi altre domande sui tag