Sento spesso la gente dire che i programmatori C ++ dovrebbero esporre l'API pubblica della propria libreria / prodotto come API C.
Cosa significa e quali sono i vantaggi di ciò?
Sento spesso la gente dire che i programmatori C ++ dovrebbero esporre l'API pubblica della propria libreria / prodotto come API C.
Cosa significa e quali sono i vantaggi di ciò?
Risposte:
Significa che la parte della tua libreria che è esposta come interfaccia utilizza solo la "parte" C del linguaggio, quindi non esporti classi o simili, solo funzioni, POD e strutture contenenti POD. Inoltre, è necessario disabilitare la modifica del nome C ++, generalmente ottenuta contrassegnando le funzioni come extern "C"
. Un esempio tipico sarebbe:
extern "C" void foo(int bar);
Il grande vantaggio di esporre le tue librerie in questo modo è che praticamente tutti i linguaggi di programmazione là fuori hanno un meccanismo per interfacciarsi direttamente con una libreria C, ma solo pochissimi possono anche interfacciarsi direttamente con una libreria C ++. Quindi, in questo senso, scegli il minimo comune denominatore per rendere più semplice l'utilizzo della tua libreria da parte di altre persone.
Tuttavia, tieni presente che questa è davvero una strategia utile solo se stai producendo una biblioteca per il consumo di altre persone. Se stai costruendo un pezzo di C ++ - solo il software e le librerie devono solo interfacciarsi tra loro, stai (IMHO) meglio esponendo le API C ++ appropriate in modo da poter sfruttare tutta la potenza del linguaggio.
extern "C"
cose che non ho ricevuto?
.hpp
, ma questa estensione significa "file di intestazione C ++", quindi dovrebbe essere .h
, che viene utilizzato sia per C che per C ++.
Oltre alla risposta di Timo, non esiste alcuna ABI C ++ standardizzata per alcune piattaforme (ad esempio Windows - alcune come Linux di Mac OS X ampiamente utilizzate), quindi non si tratta solo di una funzionalità mancante, ma dell'impossibilità di implementare tale funzionalità.
Ad esempio IIRC MSVC ha ABI diverso in ogni versione e potrebbe cambiare a seconda che si tratti di debug o build di rilascio - e non è pubblicato, quindi i compilatori di terze parti non sono generalmente compatibili (ho letto alcune informazioni che alcune versioni di icc sono compatibili con MSVC 2005, ma potrebbero essere informazioni divulgate ai sensi della NDA - non necessarie per i creatori di dire Python) e utilizzare la propria ABI. Quindi in pratica l'ambiente linguistico limiterebbe non solo la versione del compilatore ma anche i flag.
Infine, C ++ ha molte più funzioni in fase di compilazione. Ad esempio i generici di solito non esistono nelle lingue tipizzate dinamicamente ecc.