Newsgroup: it.comp.os.linux.development
Titolo: compilare C e C++ insieme (bug compilatore ?)

Ho provato a ricompilare del codice che avevo scritto tempo fa utilizzando
le GTK (e che avevo gia' compilato con successo mesi fa).
Nel codice vengono inoltre usate alcune classi C++.
Questo e' quello che ora succede:
1) Se compilo col gcc va benone con le GTK ma si hanno fallimenti circa
la sintassi C++ (non riconosce la parola class ecc...)
2) Se compilo col g++ le classi le tratta bene ma fallisce con alcuni
costrutti delle GTK. 
Giusto per avere qualche certezza, ho provato a compilare col g++ gli
stessi esempi messi a disposizione nel sito delle GTK ed ho avuto gli
stessi problemi avuti col mio codice. Ad esempio:
cannot convert `void (*) (GtkWidget *, void*)' to `void (*) ()'
in initialization
Naturalmente, utilizzando il compilatore gcc, tutto va bene. Ma io ho
la necessita' di usare il g++ perche' nel mio codice ci sono anche delle
classi C++. 
Ho provato con l'opzione -fno-strict-prototype ma se ne frega dicendo che
e' obsoleta e non piu' usata.
Qualcuno sa aiutarmi ?
E poi: come mai prima compilavo lo stesso codice (non e' cambiata una
virgola) senza problemi ?
Non e' che il compilatore che ho non va bene (anche se i kernel li compila
tranquillamente) ?
Ah, dimenticavo: si tratta del gcc-2.96.81
Insomma aiutatemi.
Grazie.
-- 
  ________
 |\      /|  Sender:
 | \____/ |  Mimmo Mastronardi 
 |        |  -< 
mimmo....@libero.it
 >-        
 |________|   

Ho appena scoperto che il problema in realtà sorge solo con le
istruzioni per la creazione dei menu con itemfactory (anche se resta
il fatto che tempo fa compilavo tutto senza problemi).
Ho infatti scoperto che col g++ non si compila solo l'esempio, del
GTKTutorial, relativo ai menu (il file itemfactory.c).
Se qualcuno riesce a compilare l'esempio itemfactory.c con il g++ mi 
faccia sapere.


 Grazie.
Mischiare codice C++ e codice C, e' pericoloso perche' NON e' garantito il 
funzionamento: la funzione main nei due casi *puo'* essere diversa.
Comunque un sistema per mischiare i due codici e' il seguente:
Crei un modulo in C++ ( che compilo con 'g++ -c' ), con alcune funzioni C 
che chiamano le corrispondenti C++: 
file header.h:
-------------------------------
#ifdef __cplusplus
extern "C" {
#endif
        void funzione_wrapper( );
        // eventuali altre funzioni C richiamate da codice C++
#ifdef __cplusplus
};
#endif
--------------------------------
file_cpp.cpp:
--------------------------------
#include "header.h"
// funzione Wrapper
void funzione_wrapper( ){
        funzione_cpp( );
};
void funzione_cpp( ){
        class   a .........
}
--------------------------------
file_c.c:
--------------------------------
#include "header.h"
void funzione_c_che_richiama_codice_cpp( ){
        funzione_wrapper( );
}
---------------------------------
Per compilare
$ g++ -c file_cpp.c
$ gcc -c file_c.c
$ gcc -o programma file_c.o file_cpp.o
In pratica dichiari ( nel modulo C++ ) una funzione C, che e' quella che 
richiami dal modulo C; la dichiarazione del tipo di funzione e' ottenuta 
con la sintassi
extern "C" {
        [.....]
}
Ribadisco che lo standard C++ non garantisce che il mix funzioni. L'unico 
problema che ho incontrato con il gcc e' quando le eccezzioni a 
attraversano codice C.

 in initialization
Questo e`  solo un'esempio di  quello che puo` succedere  (conversione a
void *). Dovresti  compilare la parte C  con il gcc e  poi linkarla alla
parte c++ del  programma. Occhio che le funzioni esportate  dal modulo C
devono essere dichiarate nel listato c++ come:
extern "C" int foo(int);
Oppure dovresti usare le funzioni GTK direttamante dal codice C++ (senza
wrapper in C). In questo caso gli header delle GTK vanno inclusi cosi:
extern "C" {
#include <blabla.h>
}
Questo e` valido solo se riscrivi il vecchio codice in C++.
Con uno dei due modi (probabilmente il primo) dovresti risolvere.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Se alla sera, dopo una strepitosa vittoria, guardandoti allo
specchio dovessi notare un secondo paio di palle, che il tuo 
cuore non si riempia d'orgoglio, perche` vuol dire che ti 
stanno inculando -- Saggio Cinese

 attraversano codice C.
Non è pericoloso se
1.
Poni attenzione al name mangling dei simboli
2.
Sei cosciente delle limitazioni che questo pone ad esempio sull'overloading.
-- 
Michele Bariani
mic...@ferrara.linux.it
http://members.ferrara.linux.it/michele

$ gcc -o programma file_c.o file_cpp.o
è importante che il linking venga effettuato con g++:
$ g++ -o programma file_c.o file_cpp.o
-- 
Saluti,
    Mardy
http://castellina.org/interlingua