Cosa significa esporre pubblicamente un codice C ++ come API C e quali sono i vantaggi di farlo?


25

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:


44

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.


14
Devi anche stare attento a non esportare eccezioni generate!
James,

Questa è un'ottima risposta. Puoi darmi un esempio delle extern "C"cose che non ho ricevuto?
Daniel Ribeiro,

1
@DanielRibeiro: solo google per "extern C". Troverai link come questo: stackoverflow.com/questions/1041866/…
Doc Brown

1
@DanielRibeiro, aggiunto un esempio molto semplice.
Timo Geusch,

1
@DanielRibeiro È tecnicamente possibile ancora utilizzarlo .hpp, ma questa estensione significa "file di intestazione C ++", quindi dovrebbe essere .h, che viene utilizzato sia per C che per C ++.
Sembra il

8

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.


2
@DanielRibeiro: Benvenuti nel meraviglioso inferno di C ++ ABI ( en.wikipedia.org/wiki/Application_binary_interface ). La versione breve è che è molto difficile far compilare separatamente i componenti C ++ (compilati con diversi compilatori / flag) invece di fallire / arrestarsi in modo silenzioso.
Maciej Piechotka,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.