|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2008
Città: Roma
Messaggi: 1382
|
[C++] Usare librerie del C
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? |
|
|
|
|
|
#2 |
|
Junior Member
Iscritto dal: Mar 2009
Messaggi: 27
|
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. |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Sep 2008
Città: Roma
Messaggi: 1382
|
Grazie per la risposta
Da quello che leggo extern serve solo per le librerie non di sistema, giusto? Approfitto per un altro chiarimento cosa significa l'uso di "<" e ">" nei tipi di variabili? Per esempio: vector<string> Dove (penso) string è una classe, mentre vector non so... |
|
|
|
|
|
#4 | ||
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
Quote:
|
||
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Sep 2008
Città: Roma
Messaggi: 1382
|
Grazie mille!
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
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 |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
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". |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Ad esempio con gcc sotto linux quando il compilatore trova una dichiarazione tipo Codice:
int foo(int) 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: Codice:
#ifdef __cplusplus
extern "C" {
#endif
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:27.




















