[SOS] utiliser C++

David Decotigny david.decotigny at free.fr
Fri Jun 25 09:49:44 CEST 2004


Bonjour,

Outre le fait que le C++ necessite un petit runtime pour fonctionner 
(voir le message 
http://the-doors.enix.org/pipermail/sos/2004-June/000012.html), il y a 
quelques containtes liees aux symboles effectivement.

Car en C, une fonction dont le nom est 'toto' correspondra toujours (ou 
presque, ca depend du compilo) au symbole 'toto'. C'est vrai en 
particulier avec gcc 'pur porc' (djgpp rajoute un '_').

Mais en C++, une meme fonction 'toto' peut exister en plusieurs 
versions, suivant le type des arguments. Pour permettre ça, quand un 
compilo C++ genere le nom du symbole correspondant, inclut les 
informations relatives au prototype, ca s'appelle le 'mangling'. Pour se 
faire une idee, il suffit de faire un objdump, un nm, ou un readelf sur 
un .o compilé avec g++ : on obtient des symboles du genre '_Z4totoPici' 
pour le prototype de la *fonction* 'int toto(int *t, char a, int b)'. 
D'ailleurs, il est possible de visionner le proto original en partant du 
nom de symbole 'mangled' : c'est le demangling. Pour en profiter, 
utiliser l'option -C de nm et de objdump, ou utiliser le programme 
c++filt fourni avec g++. Je ne suis pas sûr qu'il y ait une 'norme' 
inter-compilo pour le mangling. Pour gcc, le mangling est stable depuis 
la 3.0 officiellement, la 3.1 voire la 3.2 officieusement, ce qui veut 
dire qu'on risque d'avoir des surprises en demanglant des .o compilees 
avec d'anciennes versions de g++.

Bref, pour revenir a nos moutons... si je veux utiliser une *fonction* 
C++ dans du C, il faut :
   - soit que j'appelle '_Z4totoPici' en lieu et place de 'toto' depuis 
le source C. C'est une solution *_GORET_*.
   - soit que je dise au C++ de me generer un symbole 'toto' au lieu de 
'_Z4totoPici'. Et ça, ça se fait en utilisant la fameuse construction 
'extern "C" { ... }' qu'on trouve dans quasiment tous les headers de 
/usr/include, sous forme déguisée semble-t'il (macros BEGIN_qqch ?)

On trouvera pratiquement toutes les indications pour faire cohabiter du 
code C et C++ en lisant la bible (tm) :
   http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html

Bonne journée,

-- 
David Decotigny -- http://david.decotigny.free.fr


More information about the Sos mailing list