C è una delle lingue più antiche ancora in circolazione. La sua ABI è semplice e praticamente ogni sistema operativo ancora in uso oggi è stato scritto al suo interno . Mentre alcuni di questi sistemi operativi potrebbero aver aggiunto elementi, ad esempio in C # /. NET o qualunque cosa in alto, in basso sono molto pieni di C.
Ciò significa che, al fine di utilizzare le funzionalità fornite dal sistema operativo, praticamente ogni linguaggio di programmazione là fuori bisogno di un modo di interfacciarsi con librerie C in ogni caso . Perl, Java, C ++, tutti forniscono nativamente modi per "parlare in C", perché dovevano farlo se non volevano reinventare ogni singola ruota che esiste.
Questo rende C il latino dei linguaggi di programmazione. (Quanti anni di Internet prima di quella metafora deve essere "l'inglese delle lingue di programmazione"?)
Quando scrivi la tua libreria in C, ottieni un'interfaccia compatibile con C gratuitamente (ovviamente). Se stai scrivendo la tua libreria in C ++, puoi ottenere i collegamenti C, attraverso le extern "C"
dichiarazioni come hai detto.
Tuttavia , è possibile ottenere questi attacchi solo per la funzionalità che può essere espressa in C .
Quindi l'API della libreria non può utilizzare ...
- modelli,
- classi,
- eccezioni,
- qualsiasi funzione che prende o restituisce oggetti.
Un semplice esempio, dovresti fare in modo che le tue funzioni esportate prendano e restituiscano array ( []
) invece di std::vector
(o del std::string
resto).
Quindi, non solo non saresti in grado di fornire nessuna delle cose buone che C ++ ha da offrire ai clienti della tua biblioteca, ma dovresti anche impegnarti ulteriormente per "tradurre" l'API della tua biblioteca da C ++ a "C compatibile" ( extern "C"
).
Ecco perché si potrebbe sottolineare che C è la scelta migliore per l'implementazione di una libreria. Personalmente, penso che i vantaggi del C ++ siano ancora superiori allo sforzo necessario per extern "C"
un'API, ma sono solo io.