2013-06-02 19 views
6

Stiamo lavorando su un modulo sviluppato in C++, ma dato il nuovo C++ 11, sto pensando di migrare a questo.Come portare il codice C++ esistente in C++ 11

Come procedere? Sono entrambi uguali o c'è qualche dipendenza del compilatore?

Il mio software attualmente supporta Windows e Linux. Sto usando Microsoft Visual Studio e GCC per costruirlo.

In generale, quali modifiche sono necessarie se presenti?

+2

Non si conoscono le modifiche necessarie fino all'avvio del porting. Molto probabilmente, non saranno necessarie modifiche, ma è possibile ottenere benefici (evitando spesso cicli di allocazione/copia/libero) utilizzando il vantaggio di cose come l'inoltro perfetto, la collocazione e così via. –

+4

A meno che non stiate usando la parola chiave 'auto' come identificatore della durata di memorizzazione (è stato cambiato per essere usato per l'inferenza di tipo in C++ 11) Non penso che dovrete cambiare nulla. – jrok

+1

So che 'C++ 11' è retrocompatibile con nuove funzionalità. Ma ci sono versioni del compilatore di esempio di un cambiamento specifico? –

risposta

9

vecchia C++ corretto funzionamento con il C++ 11 Compiler

  • Rivedere come si utilizza iteratori (forse si può passare a gamma-per)
  • recensione se si utilizza puntatore a funzione (forse è possibile utilizzare lamdaes)
  • Review Classe iniziatori (forse si può scrivere l'elenco di inizializzazione)
  • Review per l'utilizzo del puntatore (forse si può passare a SmartPtr)
  • Review per l'utilizzo di NULL con puntatore forse si può passare a nullpt r
+0

Il vecchio C++ scritto bene * probabilmente * funzionerà allo stesso modo con un compilatore C++ 11. Ci sono ancora alcune modifiche irrisolte, anche se non si hanno comportamenti indefiniti. È importante testare tutto accuratamente, per garantire che tutto funzioni come previsto. –

2

I problemi del compilatore sono pochi e facili da elaborare. È molto più semplice dell'adozione di un nuovo compilatore. Se hai la possibilità, continua con la lib std che usi ora, quindi aggiorna la lib std dopo che i tuoi programmi sono stati compilati come C++ 11. Potrebbe essere necessario mantenere le versioni precedenti della libreria se caricate in modo dinamico.

Se si desidera sfruttare le nuove funzionalità, dare un'occhiata a cpp11-migrate. Questo strumento può automatizzare l'adozione di alcune delle nuove funzionalità per te quando sei pronto a impegnarti completamente in C++ 11 (supponendo che i tuoi compilatori supportino tutte queste funzionalità).

2

Migrazione? Pensavo che il WG21 combattesse duramente per preservare tutta la compatibilità. A meno che tu non abbia usato l'esportazione, non hai bisogno di migrazione, il codice esistente va bene.

Immagino che intendiate davvero la domanda per il refactoring del codice esistente per riprendere le caratteristiche di C++ 11. Qui applicherei la saggezza generale sul refactoring - non farlo mai senza un obiettivo adeguato e una motivazione basata sul valore.

Solo che le nuove caratteristiche brillanti introdotte non impongono il debito tecnologico sul codice.

Ti suggerisco di iniziare a utilizzare le nuove funzionalità nel nuovo codice e di applicare modifiche più liberali in cui comunque ti rifatti per ragioni diverse. E iniziare a pensare in generale a rimodellare solo quando avere più stili è considerato un vero dolore. (La natura multi-paradigma del C++ normalmente dovrebbe consentire abbastanza molta libertà, e la forza approccio uniforme solo occasionalmente.)

Dalle nuove funzionalità quello che avevo Focus on:

  • auto. Tutto il mio nuovo codice è pieno di auto const e locali che omettono i tipi. Ok, uno ha suggerito globalreplace contraddicendo ciò che ho detto in precedenza: sostituire :: iterator l'utilizzo in automatico se si dispone di loop che li utilizzano.
  • lambda, se si utilizza algos con funzioni one-shot
  • il nuovo materiale filettatura, soprattutto std::future se si applica al progetto

Se vi capita di usare 'std :: auto_ptr' probabilmente un buon candidato anche per globalreplace.

Ho omesso la semantica del movimento perché devo ancora saltarci sopra, non sono sicuro dell'impatto, quindi lascio che altri lo suggeriscano o no.

+0

"* Pensavo che il WG21 combatteva per preservare tutta la compatibilità *" - certo, ma alcuni compilatori stanno lentamente rafforzando la conformità - e questo è un buon momento per migliorare la loro conformità e costringerci ad aggiornare i nostri programmi. inoltre, ci sono alcune modifiche irrisolte in cui i programmi conformi produrranno errori quando compilati usando std.C++ 11 (le conversioni di restringimento sono un esempio). – justin

+1

@justin: ho appena riletto quella sezione C.2 e ho concluso nuovamente che, se qualcuno dei cambiamenti si manifesta sulla mia base di codice, ha già un bug latente sul posto. (IUC il cambiamento di conversione restringente si applica solo a brace-init, dove mi aspetto tipi di corrispondenza.) La mia estrapolazione da quella è la migrazione non dovrebbe essere uno sforzo degno di menzione rispetto ai soliti problemi che la vita reale ci getta. Ma non discuterò la diversa esperienza o opinione di nessuno. Sarebbe interessante raccogliere storie di vita reale. –

+0

vedi il link di Ali per un elenco più completo di cambiamenti di rottura. non ero d'accordo che l'oscura "esportazione" fosse l'unica vera preoccupazione.qui, stimiamo che ci sia voluta circa un'ora per 50.000 linee fisiche di codice per aggiungere il supporto per C++ 11 su un compilatore e una libreria std compatibile con C++ 11 al punto in cui si costruisce e collega OK. seguendo libs/compilatori vai più veloce. codebase e progetti mal conservati più lenti. test omesso. quella fase di adozione sarebbe probabilmente costata alla maggior parte delle squadre pochi giorni dedicati - al massimo settimane e ore nella fascia bassa. (cont) – justin

2

Come altri hanno sottolineato, il codice verrà probabilmente compilato correttamente. Se siete curiosi di cosa potrebbe andare male, quindi vedere

What breaking changes are introduced in C++11?

Se state pensando di cambiare il vostro vecchio codice per utilizzare C++ 11 caratteristiche, vorrei aggiungere auto-Baget's answer.