View Full Version : libreria c++ su codice c
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...
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++...
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.
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:
..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!
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.
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
: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.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.