[C/C++] Comment mélanger C et C++ ?

Comment mélanger C et C++ ? [C/C++] - C - Programmation

Marsh Posté le 17-10-2006 à 07:21:14    

Salut à tous,  
 
Voilà j'ai 2 fichiers qui gèrent les liste chainées simples (ListeSimple.c et ListeSimple.h) écrits en C "pur". Lorsque je fais une directive include dans un fichier test.C (en C++) et que j'essaie d'appeler une fonction implémentée dans le fichier ListeSimple.c la compilation me génère une erreur :  
 

Code :
  1. test.o : Dans la fonction "main()":/[...]/src/test.C:14: référence indéfinie vers « sll_new()   »
  2. test.o : Dans la fonction "main()":/[...]/src/test.C:26: référence indéfinie vers « sll_insert(sll*, void*)»


 
Alors que les fonctions en question "sll_new()" et "sll_insert()" sont bien présentes et implémentées dans le fichier ListeSimple.c/h !
 
Je galère sur cette erreur (toute bête j'espère) depuis un moment et je vois pas d'où ça peut venir, à part d'une subtilité à faire pour mélanger C et C++.  
 
Que ceux qui ont une idée m'apporte un peu d'espoir svp :)

Reply

Marsh Posté le 17-10-2006 à 07:21:14   

Reply

Marsh Posté le 17-10-2006 à 08:48:22    

Avant tout, pourquoi utiliser des listes faites en C dans un programme C++ ? De telles choses existent déjà !!! (cf. STL)
 
Sinon pour ton problème montre un peu ton code, cela peut aider.

Reply

Marsh Posté le 17-10-2006 à 08:58:23    

nanawel a écrit :

Voilà j'ai 2 fichiers qui gèrent les liste chainées simples (ListeSimple.c et ListeSimple.h) écrits en C "pur". Lorsque je fais une directive include dans un fichier test.C (en C++) et que j'essaie d'appeler une fonction implémentée dans le fichier ListeSimple.c la compilation me génère une erreur :  


Il est tout à fait possible d'utiliser des fonctions écrites (et compilées) en C dans un projet C++. Il suffit d'indiquer au compilateur C++ qu'il doit utiliser les noms 'purs' du C et non des noms 'décorés' du C++.  
 
Il y a donc une précaution à prendre au niveau du header :
 
Il faut encadrer la définition des prototypes par  

Code :
  1. /* *.h */
  2. extern "C"
  3. {
  4.    ...
  5. }


Pour rester compatible avec le C (extern "C" n'est pas du C, c'est du C++), on active ces instructions uniquement en C++ :

Code :
  1. /* *.h */
  2. #ifdef __cplusplus
  3. extern "C"
  4. {
  5. #endif
  6.    ...
  7. #ifdef __cplusplus
  8. }
  9. #endif

Message cité 1 fois
Message édité par Emmanuel Delahaye le 17-10-2006 à 08:59:34

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 17-10-2006 à 15:45:34    

Emmanuel Delahaye a écrit :

Il est tout à fait possible d'utiliser des fonctions écrites (et compilées) en C dans un projet C++. Il suffit d'indiquer au compilateur C++ qu'il doit utiliser les noms 'purs' du C et non des noms 'décorés' du C++.  
 
Il y a donc une précaution à prendre au niveau du header :
 
Il faut encadrer la définition des prototypes par  

Code :
  1. /* *.h */
  2. extern "C"
  3. {
  4.    ...
  5. }




 
Ah ben la voilà la subtilité que je cherchais ! Merci beaucoup Emmanuel je teste dès ce soir et je tiens au courant du résultat !

Reply

Marsh Posté le 17-10-2006 à 18:17:06    

Ok merci c'était bien ça !
Encore merci et bonne journée !

Reply

Marsh Posté le 12-09-2013 à 22:33:10    

Bonjour.
 
Un grand merci. :hello:  
Comme quoi même après plusieurs années c'est un post super utile.
Cela fait 2 jours que je galère pour faire l'édition de liens. :heink:  
 
Merci.
 
jf

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed