Newsgroup: it.comp.lang.c++
Titolo: Linkare objects in C

Salve, vorrei linkare un object scritto in C in un programma
VC++. Mentre cerco sulla guida online, consigli?
Vinicio Coletti - 
v.co...@iol.it
 - 
http://www.webcom.com/vcoletti
President of the First International Collectivist Association
- "hey! hands off my girl!" -

VC++. Mentre cerco sulla guida online, consigli?
Supponiamo che tu abbia il seguente file, chiamato vecchio.c:
int vecchio(int argo)    { return argo+23; }
compilato da un compilatore C per produrre un vecchio.obj.
Vuoi chiamare questa funzione (senza ricompilare il file vecchio.c)
da codice C++, ad esempio in un contesto come (file nuovo.cpp):
class nuovo {
    int data;
public:
    nuovo(int i): data(i) {}
    void aggiorna() { data = vecchio(data); }
};
Ebbene, per ottenere questo basta che tu preponga alla chiamata
questa esatta dichiarazione:
    extern "C" int vecchio(int);
Il costrutto ``extern "C"'' e` fatto apposta per coprire proprio questo
tipo di esigenze, e dice al compilatore C++ che la funzione vecchio
segue le convenzioni di nomi e chiamata del C, non del C++.
Questo naturalmente da` anche dei vincoli: in particolare, NON e`
possibile ottenere l'overload di funzioni extern "C" (le convenzioni
di nomi del C, che sei vincolato a seguire, non lo supportano).
Un'altra cosa... probabilmente tu disponi gia` di un header file vecchio.h
contenente qualcosa di simile alla singola linea:
    extern int vecchio(int);
perche` chi ti distribuisce vecchio.obj normalmente distribuisce anche
il relativo header file.   Per una funzione sola non e` un grosso problema,
ma di solito questi obj (e lib) di funzioni ne esportano parecchie, e quindi
i loro header file sono pieni di dichiarazioni.  Sarebbe un peccato dovere
fare del taglia e cuci, editando l'header file per mettere extern "C" una
per una a tutte queste funzioni!
Il C++ ti permette dunque di avere *molteplici* dichiarazioni controllate
da un *singolo* costrutto extern "C" -- basta richiuderle fra parentesi
graffe -- e in particolare le dichiarazioni possono anche stare in un
header file.  Quindi se hai gia` l'header file scrivi qualcosa come:
extern "C" {
#include "vecchio.h"
}
NOTA le graffe { }, mi raccomando!
Alex

NOTA le graffe { }, mi raccomando!
Grazie mille Alex. Avevo provato l'extern "C" ma solo davanti
alle singole funzioni contenute nel file header.
In questo caso si tratta di un mio programma, scritto in passato
in C e che non mi va al momento di trasformare in una serie di
classi C++. Sto provando la cosa sia perche' mi serve ora, sia
perche' puo' essere appunto utile per linkare librerie fornite da
altri.
Il tuo esempio funziona benissimo, ma ho ancora dei problemi,
perche' il linker mi dice che ci sono delle funzioni ridefinite.
Ho cercato informazioni sulle librerie del VC++, con i consigli a
non mescolare i diversi tipi di librerie ed ho aggiunto nei
parametri del linker l'esclusione di qualcuna di esse, seguendo
pedissequamente lo schema indicato dalla Microsoft.
La situazione attuale e' che non ci sono piu' duplicazioni, ma mi
rimangono due funzioni non risolte dal linker...
Non sono funzione "mie", quindi ora dovro' capire in quale lib si
trovano.


trovano.
Il programmino DUMPBIN ti puo` aiutare a cercare questo tipo
di informazioni.  Buona caccia!
Alex