Salut,
voir à la fin. Pour une fois que je connais bien le fin mot de
l'histoire... :-)
>>>>> "frederic" == frederic Giroud <postcard@???> writes:
frederic> Frederic Mantegazza wrote:
>> Lorsqu'une fonction C est compilee avec un compilateur C, ces
>> infos n'existent pas. On previent donc de cette maniere le
>> compilo C++ de ne pas les chercher. D'apres le peu que j'ai lu,
>> certains sortent un warning, d'autres une erreur.
frederic> Les erreurs que j'avais renconte, ne se produisait qu'a
frederic> l'edition des liens (des fonctions du systeme introuvable
frederic> !!)
frederic> Avec ce que tu dis, cela laisse entendre qu'il existe des
frederic> formats different pour les ".o" suivant le compilateur
frederic> utilise...
frederic> C'est le cas ?
Inexact: le .o utilise bien le même format, en revanche les noms de
symboles sont modifiés par le compilo C++.
Illustration par l'exemple. J'ai pris sur mon temps & consommé
beaucoup d'énergie pour écrire ce fichier de librairie "toto.c":
#include <stdio.h>
int bidon (int i, char *s)
{
printf("bidon %i %s\n", i, s);
return i;
}
Si on le compile avec gcc (C):
[fxk@valentine fxk]> gcc -c toto.c -o toto.o
puis qu'on liste les symboles:
[fxk@valentine fxk]> nm toto.o
00000000 T bidon
00000000 t gcc2_compiled.
U printf
Tout va bien: la fonction bidon() apparait bien.
Si en revanche on utilise un compilo C++:
[fxk@valentine fxk]> g++ -c toto.c
[fxk@valentine fxk]> nm toto.o
00000000 ? __FRAME_BEGIN__
00000000 T bidon__FiPc
00000000 t gcc2_compiled.
U printf
Le symbole bidon() est alors flanqué d'ordures...
Mais si on utilise la bonne option de nm (celle qui permet de
reconnaitre les symboles issues de compli C++):
[fxk@valentine fxk]> nm -C toto.o
00000000 ? __FRAME_BEGIN__
00000000 T bidon(int, char *)
00000000 t gcc2_compiled.
U printf
Tout devient clair: Ces adjonctions au symboles sont les types des
paramètres de la fonction. Merci professeur!
Pour finir j'ajouterai:
1. Les noms de ces lettres ajoutés symboles sont _normés_ par le
C++. Ainsi 'Fi' signfie _toujours_ "valeure entiere" & "Pc"
pointeur sur char.
2. nm++ est parfois directement dispo sur certains UX (comme HP-UX).
3. Les intérets sont multiples:
- Faire (encore) une vérif de conformité des prototypes.
- Autoriser la surcharge des méthodes & fonctions C++.
- ... etc.
4. Pour s'affranchir de cette ajonction, quand on a qu'un compilo C++
sous la main, une légère transformation de toto.c s'impose:
#include <stdio.h>
extern "C" int bidon (int i, char *s)
{
printf("bidon %i %s\n", i, s);
return i;
}
On a alors:
[fxk@valentine fxk]> g++ -c toto.c
[fxk@valentine fxk]> nm toto.o
00000000 ? __FRAME_BEGIN__
00000000 T bidon
00000000 t gcc2_compiled.
U printf
A+.
--
Fix & Cathy KOWALSKI mailto:ayoul@club-internet.fr
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
A strife of interests masquerading as a contest of principles. The
conduct of public affairs for private advantage. -- Ambrose Bierce