Una libreria C ++ 11 compilata (lib, dll, ecc.) può essere collegata in vecchi compilatori C ++?

11

I compilatori C ++ precedenti (ad esempio VS2008 e gcc3.4) potrebbero collegarsi con librerie esterne scritte in C ++ 11?

Il mio pensiero è che i file .lib C ++ 11 siano solo codice byte in questa fase, e non dovrebbe disturbare i vecchi compilatori come è stato generato, a patto che sia in qualche modo risolvibile e chiamabile.

Sto sviluppando una piccola libreria la cui API dovrebbe ancora supportare gli utenti C ++ 03. Quindi, guardando avanti, mi chiedo se sia corretto implementare la mia libreria utilizzando funzionalità utili come std::unique_ptr e così via, oppure devo limitarmi a boost:: ?

    
posta Konafa 27.08.2012 - 05:36
fonte

2 risposte

9

Se la tua libreria utilizza solo C ++ 11 nella sua implementazione e non espone pubblicamente strutture o tipi C ++ 11, e specialmente se usi il collegamento statico, allora sì, questo è possibile e persino standard.

Considera il caso comune in cui una libreria espone un'interfaccia di livello C (per essere utilizzabile dalla più ampia varietà di client) ma che è implementata internamente in C ++. I client che si collegano a tale libreria devono solo preoccuparsi dell'API pubblica binaria (funzioni esportate), che sarà vincolata a essere legacy C / C ++ per la massima compatibilità. Un programma Java può collegarsi alle API a livello C che sono implementate internamente in C ++. Ciò non significa che Java abbia bisogno di "supportare C ++". Allo stesso modo, un client C / C ++ vecchio stile può collegarsi a un'API di livello C o C ++ che utilizza internamente una versione più avanzata delle librerie C ++ o di altre librerie. Due cose distinte: cosa è necessario collegare all'interfaccia della libreria e cosa la libreria stessa collega internamente (o estrae staticamente).

Semplicemente non esporre i client della tua libreria alle dipendenze della tua implementazione.

Se puoi collegare staticamente le tue dipendenze (C ++ 11 o qualsiasi altra cosa) nella tua libreria, questo è pulito e autonomo. La biblioteca è una vera scatola nera: nient'altro che il bytecode. Ma anche se la libreria si collega alle dipendenze tramite il collegamento "implicito dinamico" (da non confondere con il tipo LoadLibrary / GetProcAddress esplicito e i metodi simili su * nix e OS X), i client più vecchi dovrebbero comunque essere in grado di collegarsi a quella libreria interfaccia pubblica, anche se non potevano collegarsi alle librerie la libreria dipende da .

    
risposta data 27.08.2012 - 19:53
fonte
3

Sembra che tu voglia scrivere una nuova libreria che altri possano usare e che vorresti usare C + 11 come linguaggio di implementazione. Ci sono una serie di problemi da considerare:

  • introducendo una nuova versione di C ++ introdurrà la necessità di distribuire le nuove librerie di runtime C ++ con la libreria, è OK?
  • dovresti non usare nuovi tipi di C + 11 nella tua interfaccia pubblica, altrimenti non saranno in grado di chiamarlo.
  • In generale, dovresti evitare tipi complessi, come unique_ptr, persino vector, ecc. A meno che non stiate distribuendo la vostra libreria come codice sorgente, il layout degli oggetti nella libreria potrebbe differire dal layout nel codice client. Rimani con tipi semplici che non hanno alcun rischio di variazioni del layout degli oggetti.
risposta data 27.08.2012 - 06:06
fonte

Leggi altre domande sui tag