PDA

View Full Version : [C++] Usare librerie del C


Damage92
06-06-2010, 16:25
Sto imparando il C++ conoscendo il C.
Voglio "importare" una funzione scritta in C nel programma che sto scrivendo, che però utilizza una libreria esterna. Dunque mi chiedevo se è possibile includere direttamente la libreria che usavo il C, oppure se devo per forza usare il wrapper per C++.
Il wrapper serve solo per rendere la libreria in stile OOP, giusto?

Un'altra cosa che c'entra poco col titolo: ho letto cosa sono i namespace, ma cosa succede se due librerie hanno namespace con nomi uguali? Quando uso l'istruzione "using namespace" come fa il compilatore a capire a quale libreria mi riferisco?

sprik
07-06-2010, 01:53
Puoi includere l'header della libreria C che vuoi utilizzare con extern

extern "C" {
#include "libreriaC.h"
}


Se ci sono più namespace con lo stesso nome il compilatore ti darà un errore per dichiarazione multipla di namespace, o perlomeno così ricordo.

Damage92
08-06-2010, 19:35
Grazie per la risposta :)
Da quello che leggo extern serve solo per le librerie non di sistema, giusto?

Approfitto per un altro chiarimento :D
cosa significa l'uso di "<" e ">" nei tipi di variabili? Per esempio:
vector<string>
Dove (penso) string è una classe, mentre vector non so...

fero86
09-06-2010, 00:40
Un'altra cosa che c'entra poco col titolo: ho letto cosa sono i namespace, ma cosa succede se due librerie hanno namespace con nomi uguali? Quando uso l'istruzione "using namespace" come fa il compilatore a capire a quale libreria mi riferisco? non esiste il fatto che due namespaces abbiano lo stesso nome: il compilatore li considera lo stesso namespace eventualmente riaperto una seconda volta. se due headers che includi dichiarano simboli all'interno di namespaces omonimi il risultato é che tu hai un unico namespace in cui sono dichiarati i simboli di entrambi gli headers, i quali naturalmente possono anche collidere ed impedire la compilazione.



Approfitto per un altro chiarimento :D
cosa significa l'uso di "<" e ">" nei tipi di variabili? Per esempio:
vector<string>
Dove (penso) string è una classe, mentre vector non so... le parentesi ad angolo vengono usate per definire ed istanziare i templates, immagino che tu non li abbia ancora fatti. std::vector é una template class delle STL; qui ne trovi il reference: http://www.cplusplus.com/reference/stl/vector/

Damage92
09-06-2010, 18:18
Grazie mille! :)

Tommo
09-06-2010, 19:49
Ma extern serve davvero?
Generalmente mi limito ad includere la roba e funziona; vale per OpenAL, OpenGL, nedmalloc, FreeImage, FreeType etc.
Sarà che ormai non esistono più librerie "vere" per C :D

fero86
10-06-2010, 01:01
Ma extern serve davvero? extern serve ad evitare il mangling dei nomi; serve se i simboli dichiarati devono ad esempio essere importati da una DLL che li esporta con nomi non decorati.

in generale quando si esportano simboli da una DLL scritta in C++ sarebbe bene esportarli sempre in forma non decorata perché le convenzioni di mangling non sono standardizzate (nonostante il mangling sia una evidente necessitá implementativa dei compilatori C++) e quindi variano da un compilatore all'altro: per esempio non é possibile importare col MinGW simboli decorati esportati da una DLL scritta in Visual C++, bisogna usare per forza extern "C".

marco.r
10-06-2010, 02:01
Ma extern serve davvero?
Generalmente mi limito ad includere la roba e funziona; vale per OpenAL, OpenGL, nedmalloc, FreeImage, FreeType etc.
Sarà che ormai non esistono più librerie "vere" per C :D

Si' e' necessario. Non e' affatto garantito che i simboli esportati dal compilatore C e da quello C++ siano uguali, anche compilando lo stesso identico codice.
Ad esempio con gcc sotto linux quando il compilatore trova una dichiarazione tipo

int foo(int)

generera' del codice che esporta nel caso del C il simbolo 'foo' e nel caso del C++ il simbolo '_Z3fooi' (o comunque una altra rappresentazione nota al compilatore.
Quindi quando devi linkare in C++ funzioni scritte in C devi indicarlo al compilatore.

Spesso non si nota perche' le maggiori librerie inseriscono delle guardie opportune negli header per evitare all'utilizzatore l'impacci di farlo lui.
Ad esempio sotto linux l'header di FreeImage ha all'inizio il seguente spezzone di codice:

#ifdef __cplusplus
extern "C" {
#endif


Immagino che per VS si operi in modo analogo.

fero86
10-06-2010, 03:27
Immagino che per VS si operi in modo analogo. sissignore

Tommo
10-06-2010, 11:49
Ok, quindi mi hanno "salvato" loro :ads:
Grazie per la delucidazione :stordita: