Spesso sento dire che i programmatori C ++ dovrebbero esporre l'API pubblica della loro libreria / prodotto come API C.
Che cosa significa e quali sono i vantaggi di questo?
Spesso sento dire che i programmatori C ++ dovrebbero esporre l'API pubblica della loro libreria / prodotto come API C.
Che cosa significa e quali sono i vantaggi di questo?
Significa che la parte della libreria che è esposta come interfaccia utilizza solo la "parte" C della lingua, quindi non stai esportando classi o simili, solo funzioni, POD e strutture contenenti POD. Inoltre, è necessario disabilitare il nome di manganing del nome C ++, in genere ottenuto contrassegnando le funzioni come extern "C"
. Un tipico esempio potrebbe essere:
extern "C" void foo(int bar);
Il grande vantaggio di esporre le tue librerie in questo modo è che praticamente ogni linguaggio di programmazione ha 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 facilitare l'utilizzo della tua biblioteca da parte di altre persone.
Tuttavia tieni presente che questa è davvero solo una strategia utile se stai producendo una libreria per il consumo da parte di altre persone. Se stai costruendo un pezzo di C ++ - solo il software e le librerie hanno solo bisogno di interfacciarsi tra loro, sei (IMHO) meglio di esporre le API C ++ corrette in modo da poter sfruttare tutta la potenza del linguaggio.
Oltre alla risposta di Timo - non esiste alcun ABI C ++ standarizzato per alcune piattaforme (ad esempio Windows - alcune come Linux di Mac OS X ampiamente adottato) quindi non è solo questione di funzionalità mancante ma impossibilità di implementare tale funzionalità.
Per esempio IIRC MSVC ha ABI diversi in ogni versione e potrebbe cambiare a seconda che si tratti di debug o release build - e non è pubblicato quindi i compilatori di terze parti di solito non sono compatibili (ho letto alcune informazioni che alcune versioni di icc sono compatibile con MSVC 2005 ma potrebbe essere un'informazione divulgata sotto NDA (non necessaria ai creatori di Python) e utilizzare il proprio ABI. Quindi in pratica l'ambiente linguistico limiterebbe non solo la versione del compilatore ma anche i flag.
Finalmente il C ++ ha molte più funzioni in fase di compilazione. Ad esempio i generici di solito non esistono nelle lingue digitate dinamicamente ecc.