Newsgroup: it.comp.lang.c
Titolo: interscambio tra C e C++ e viceversa

Salve a tutti
ho un dubbio, nato dal fatto che praticamente non c'ho mai sbattuto il
naso, ma è una cosa che mi solletica la curiosità !!
Il dubbio è il seguente:
Posso creare librerie ( nel mio caso dei .so ) o degli oggetti (.o) in
C e poi accederci da C++ ?
ma il dubbio più grande è, posso fare il contrario ? cioè da C
accedere a librerie scritte in C++ ?
Per approfondire questo argomento ( lavoro sotto Linux, ma vanno bene
anche cose generiche ) cosa mi conviene cercare ? .... sono rimasto
davanti a google con un gigante emblematico punto interrogativo sulla
testa con l'assoluto vuoto di quali chiavi di ricerca utilizzare :)
grazie infinite !


La parola magica e': extern "C" :-)
Grazie a questa direttiva il compilatore c++ utilizza le convenzioni
del C per dare i nomi alle funzioni: in questo modo riesci a
usare funzioni scritte in C nel tuo programma C++ e viceversa.
Es (non testato):
nel .h scrivi:
extern "C" {
int Func(int x, double y);
}
nel .cc scrivi normalmente
int Func( int x, double y) { ... }
Il file .o generato esporta una funzione che invece di avere il nome
decorato alla maniera del c++ e' il semplice nome usato dal c
(dipende dalla piattaforma che usi, ma per fare un esempio il nome sara' 
semplicemente _Func al posto del piu' complesso _Func_ri_id )
A questo punto un programma in C puo' tranquillamente linkare la tua
funzione perche' ha il nome che si aspetta.
Lo stesso ragionamento vale al contrario: se hai una funzione scritta in
C il nome esportato sara' _Func , se la vuoi usare in un file c++ 
mettendo extern "C" avverti il compilatore che deve linkare con una
funzione che si chiama _Func e non con il nome decorato _Func_ri_id.
spero di averti chiarito i dubbi, altrimenti chiedi pure.
ciao
Giacomo


ma se Func è un metodo di classe ? ... mmmh
poi va beh, ora cercherò di fare qualche ricerca con quello che mi hai
suggerito !!
grazie

 ma se Func č un metodo di classe ? ... mmmh
Non č possibile chiamarla da C. La libreria C++ dovrebbe presentare
un'interfaccia apposta per essere accessibile dal C.
E.

 E.
ma questa funzione in C++ con scope globale, può istanziare al suo
interno delle classi ?
grazie a tutti !!!


Certo, può fare quello che le pare!
E.

 Certo, può fare quello che le pare!
Ok, quindi questa funzione verrà usata come ponte di congiunzione !!!
E quindi, se lo sviluppatore della "libreria" non c'ha pensato allora
non si potrà fare nulla .... se non crearsi da per se in C++ il
codicillo per unire quel che ci servirà poi usare in C.
ho capito bene ?
:)
Grazie !!!

 codicillo per unire quel che ci servirà poi usare in C.
Di solito però questo problema non si pone. Se una libreria è scritta in
C++ tipicamente vuol dire che utilizza fortemente le classi. Mi viene in
mente ad esempio una libreria per una interfaccia grafica (GUI). Una
tale libreria viene difficilmente tradotta in C. D'altra parte perché
l'utente della libreria dovrebbe utilizzare il C invece che il C++?
E.

?manu* ha scritto:

Si, in quel caso ti darei ragione, ma potrebbe capitare che trovo una
libreria per un calcolo scientifico bello tosto che è scritta in C++ e
che voglio integrare nel mio programma scritto in C , in quel caso
l'utilizzo è limitato rispetto ad un utiluizzo di un "framework" di
librerie .... non so, mi vegono in mente le QT
grazie 1000

 che voglio integrare nel mio programma scritto in C 
Puoi sempre scriverti tu, in C++, l'interfaccia che ti serve.
E.