PDA

View Full Version : libreria c++ su codice c


agus83
18-10-2007, 10:03
Ciao a tutti,
sono nuovo del forum e pure della programmazione. Ho un problema: dovrei usare sul mio codice c funzioni di una libreria (libcrypt++) scritta in c++. Posso utilizzarla? Se si, come faccio a richiamare le funzioni?
Grazie ancora,
Agus83 :)

Ziosilvio
18-10-2007, 10:35
Ho paura di no: C++ non è C, e il compilatore opera in modo diverso sui programmi C e su quelli C++; oltretutto, C++ ha molti costrutti che in C non esistono.
Potresti, invece, modificare il tuo programma C quel tanto che basta a renderlo un programma C++.

Comunque, giro la questione agli esperti veri del forum, che la questione interessa anche me...

agus83
18-10-2007, 10:50
grazie mille :)

ilsensine
18-10-2007, 10:57
C'è un modo, devi crare delle funzioni c++ dichiarate come extern "C" (di conseguenza accessibili anche da c) che invocano le funzioni c++. Nel caso di accessi a classi, il principio è simile ma un pò più complicato.
C'è da chiedersi invece per quale masochistico motivo vuoi farlo, quando basterebbe scrivere il programma in c++...

71104
18-10-2007, 10:58
se la libreria in questione ti viene fornita come DLL potresti avere problemi ad utilizzarla persino in C++ visto che il mangling dei nomi dei simboli non segue una convenzione standard, ma può variare da un compilatore all'altro. questo è il motivo percui quando si scrive una DLL per Windows (o un qualsiasi altro eseguibile che esporta simboli) è buona abitudine scriverla in C oppure scriverla in C++ esportando solo funzioni con extern "C".

per quanto riguarda l'uso in C, la risposta è no, qualunque sia la forma in cui ti viene fornita la libreria, semplicemente perché ti costringerebbe a fare hack orribili non contemplati da alcuno standard (e.g.: caricare i metodi dalla DLL con GetProcAddress utilizzando i nomi decorati :asd: ).

il consiglio di ZioSilvio non è niente male: la stragrande maggioranza delle volte per convertire un programma da C a C++ è sufficiente cambiare le estensioni dei file sorgenti da .c a .cpp.

agus83
18-10-2007, 11:08
Scusate,purtroppo non sono stato molto dettagliato nella spiegazione.
Allora,io sto implementando in C un modulo di sicurezza SRTP per uno streaming server. Purtroppo utilizza algoritmi di cifratura, come AES e SHA1, che la libreria 'libcrypt' non supporta (mi bastava inserire il file header e poi usare tranquillamente le funzioni encrypt() ecc....). Adesso stavo cercando alternative e mi sono imbattuto in 'libcrypt++' che fa proprio al caso mio. Ho pero' visto che è scritta in C++......come posso fare per utilizzare le sue funzioni ci cifratura dentro al mio codice sorgente? trasformo il mio codice in c++? il resto del codice del server è in C,può avere qualche ripercussione?. Sono ancora molto inesperto di programmazione.Grazie mille per l'aiuto veramente :)

trallallero
18-10-2007, 11:27
sto implementando in C un modulo di sicurezza SRTP per uno streaming server.

Sono ancora molto inesperto di programmazione

:what: c'è qualcosa che non quadra :wtf:

agus83
18-10-2007, 12:36
..diciamo che oltre alle cose base tipo liste e strutture non vado oltre. in se come cosa nn è difficile,basta seguire lo standard e il gioco è fatto ;) ..il fatto di dover fare solo il modulo da inserire sul server che fa gia tutto è un vantaggio enorme!

71104
18-10-2007, 13:28
Scusate,purtroppo non sono stato molto dettagliato nella spiegazione.
Allora,io sto implementando in C un modulo di sicurezza SRTP per uno streaming server. Purtroppo utilizza algoritmi di cifratura, come AES e SHA1, che la libreria 'libcrypt' non supporta (mi bastava inserire il file header e poi usare tranquillamente le funzioni encrypt() ecc....). Adesso stavo cercando alternative e mi sono imbattuto in 'libcrypt++' che fa proprio al caso mio. Ho pero' visto che è scritta in C++......come posso fare per utilizzare le sue funzioni ci cifratura dentro al mio codice sorgente? trasformo il mio codice in c++? il resto del codice del server è in C,può avere qualche ripercussione?. Sono ancora molto inesperto di programmazione.Grazie mille per l'aiuto veramente :)
se tu prendi semplicemente tutti i tuoi files .c e cambi tutte le estensioni in .cpp l'unica possibile ripercussione che vedo è dovuta al mangling dei nomi, che potrebbe impedire l'importazione di eventuali simboli esportati, se ne hai; per ovviare basta che all'inizio della dichiarazione di ciascun simbolo esportato aggiungi questo:
extern "C"

esempio:

void f(int ciao); /* prima */
extern "C" void f(int ciao); /* dopo */


alternativa:

#ifdef __cplusplus
extern "C" {
#endif

void f1(int ciao);
void f2(int come);
void f3(int stai);
void bene_grazie();
.
.
.
/* dichiarazione di tutte le tue funzioni esportate */

#ifdef __cplusplus
}
#endif


quando avrai cambiato le estensioni dei sorgenti e usato extern "C", come per magia potrai iniziare ad utilizzare codice C++. anzi ora che ci penso potresti avere qualche problema dovuto allo sfruttamento di sottigliezze che cambiano da C a C++; per esempio se dichiari una stringa come questa:

char pippo[5] = "pippo"; /* manca lo spazio per il terminatore NUL */

si tratta di una circostanza che in C e in C++ viene gestita diversamente. però spero che tu non abbia di questi problemi: dichiarare stringhe in questo modo è una discreta porcata e quindi spero che tu non l'abbia fatto :D.

trallallero
18-10-2007, 13:33
char pippo[5] = "pippo"; /* manca lo spazio per il terminatore NUL */

si tratta di una circostanza che in C e in C++ viene gestita diversamente

questa mi è nuova ... in C++ come viene gestita ?

ilsensine
18-10-2007, 13:43
questa mi è nuova ... in C++ come viene gestita ?
Nella maniera più ovvia: hai un errore di compilazione.

agus83
18-10-2007, 13:48
ci provo allora! thanks :)

trallallero
18-10-2007, 13:50
Nella maniera più ovvia: hai un errore di compilazione.

:doh: ero convinto lo facesse anche il comp C invece ... manco un warning

recoil
18-10-2007, 13:55
:doh: ero convinto lo facesse anche il comp C invece ... manco un warning

confermo, nemmeno con -Wall
io tutto sommato mi trovo meglio, ci sono abituato. certo in Java/C# certi errori non li fai perché non compila nemmeno :D

ilsensine
18-10-2007, 14:35
:doh: ero convinto lo facesse anche il comp C invece ... manco un warning
Perché il c interpreta come se vuoi assegnare i 5 caratteri "pippo" alla variabile; il c++ più fiscalmente dice "Hai scritto "pippo"? Quindi hai una stringa di 5+1 caratteri".

Singolarmente, sizeof("pippo") fornisce 6 sia in c che in c++. Se dichiari correttamente char pippo[6], il comportamento è identico nei due linguaggi.

Non ti da neanche in warning perché in c non è scorretto quello che hai scritto.