Re: C++, Qt et bouquins

Page principale

Répondre à ce message
Auteur: Francois-Xavier KOWALSKI
Date:  
À: guilde
CC: 
Sujet: Re: C++, Qt et bouquins
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