[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