C è una delle lingue più antiche ancora in circolazione. Il suo ABI è semplice, e praticamente ogni sistema operativo ancora in uso oggi è stato scritto in esso . Mentre alcuni di questi sistemi operativi potrebbero aver aggiunto roba, ad es. in C # /. NET o qualsiasi cosa sopra, in basso sono molto immersi in C.
Ciò significa che, al fine di utilizzare la funzionalità fornita dal sistema operativo, praticamente ogni linguaggio di programmazione in uscita necessitava comunque di un interfaccia con le librerie C . Perl, Java, C ++, tutti nativamente forniscono dei modi per "parlare C", perché dovevano farlo se non volevano reinventare ogni singola ruota che c'è.
Questo rende C il latino dei linguaggi di programmazione. (Quanti anni di internet prima di quella metafora devono essere "l'inglese delle lingue di programmazione"?)
Quando scrivi la tua libreria in C, ottieni un'interfaccia C-compatibile gratuitamente (ovviamente). Se stai scrivendo la tua libreria in C ++, puoi ottenere i binding C, tramite dichiarazioni extern "C"
come hai detto.
Tuttavia , puoi ottenere quei bind solo per la funzionalità che può essere espressa in C .
Quindi l'API della tua biblioteca non può fare uso di ...
- modelli,
- classi,
- eccezioni,
- tutte le funzioni che prendono o restituiscono oggetti.
Un semplice esempio, dovresti rendere le tue riprese e return matrici esportate ( []
) invece di std::vector
(o std::string
per quello materia).
Quindi, non solo non saresti in grado di fornire nessuna delle cose buone che il C ++ ha da offrire ai client della tua biblioteca, dovresti anche andare a ulteriore sforzo per "tradurre" la tua libreria API da C ++ a "C compatibile" ( extern "C"
).
Ecco perché il punto potrebbe essere fatto che C è la scelta migliore per implementare una libreria. Personalmente, penso che i benefici del C ++ superino ancora gli sforzi necessari per un'API extern "C"
, ma sono solo io.