Directives de préprocesseur

Discutez d'informatique ici !
barbu23
Membre Transcendant
Messages: 5466
Enregistré le: 18 Fév 2007, 17:04

Directives de préprocesseur

par barbu23 » 28 Fév 2014, 18:01

Bonjour à tous,

J'ai besoin de me clarifier un point important en langage C.
Comment fonctionne le schéma suivant de directives de préprocesseur :

# ifndef DEF_NOMDUFICHIER // Si le constante n'a pas été définie le fichier n'a jamais été inclus
# define DEF_NOMDUFICHIER // On définit la constante pour qu la prochaine fois le fichier ne soit plus inclus

/* Contenu de votre fichier .h ( autres include, prototypes, define ) */

# endif

Pourriez vous m'expliquer comment se déroule le fonctionnement de ce préprocesseur avant la compilation à l'aide des commentaires çi - dessus ?

Merci d'avance. :happy3:



barbu23
Membre Transcendant
Messages: 5466
Enregistré le: 18 Fév 2007, 17:04

par barbu23 » 01 Mar 2014, 15:19

svp, j'ai besoin de votre aide. :happy3:

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 01 Mar 2014, 17:22

c'est la galère d'expliquer comment ca marche un préprocesseur...

t'as pas une question plus précise?
la vie est une fête :)

barbu23
Membre Transcendant
Messages: 5466
Enregistré le: 18 Fév 2007, 17:04

par barbu23 » 01 Mar 2014, 17:28

fatal_error a écrit:c'est la galère d'expliquer comment ca marche un préprocesseur...

t'as pas une question plus précise?


Ma question est de m'expliquer comment fonctionne simultanément les directives de préprocesseur :
# ifndef
# define
# endif
pour éviter les doubles - inclusions de deux fichier de type .c ou .h .

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 01 Mar 2014, 18:02

Ben déjà, tu peux inclure tout ce que tu veux, pas forcément des .c ou des .h
Généralement on inclut que les .h...

Maintenant voilà comment ca marche (à peu près)
Code: Tout sélectionner
A.c
#include "A.h"
int main(){sayHello();return 0;}

A.h
#ifndef BOB
#define BOB
void sayHello(){
  printf("no");
}
#endif


Lorsque tu compiles A.c (gcc -c A.c)
avant de compiler, tu vas inclure A.h (parce que t'as écris #include "A.h")
Donc tu lis A.h
ya écris #ifndef BOB
Est-ce qu'on a définit BOB? non.
Donc on execute le bloc jusqu'à l'endif
ensuite ya écrit #define BOB. Donc on là on définit BOB.
on arrive finalement au #endif qui dit c'est la fin du bloc, mais qq part on s'en fou.

Du coup tu copies colles tout le bloc en entete de ton fichier .c, puis tu compiles serainement.

Maintenant si tu as
Code: Tout sélectionner
A.h
#define BOB
#ifndef BOB
void sayHello(){
  printf("ouch");
}
#endif

Tu définis BOB.
Ensuite #ifndef BOB return false donc tu vas jusqu'au endif.
Au final tu as rien inclus puisque tu es pas rentré dans le bloc.

Quand tu compiles tu vas te prendre un truc style sayHello was not declared ou qqch du genre.

Je te laisse réfléchir à comment faire si tu as
Code: Tout sélectionner
A.h
#include "B.h"
void sayHello(){
 callB();
}
B.h
#include "A.h"
void callB(){
 //doing nothin'
}
void someOtherFunction(){
 sayHello();
}
A.c
#include "A.h"
int main(){
 sayHello();
}
la vie est une fête :)

barbu23
Membre Transcendant
Messages: 5466
Enregistré le: 18 Fév 2007, 17:04

par barbu23 » 01 Mar 2014, 18:35

Merci, j'ai compris les deux parties de tes explications, mais je ne comprends pas bien la question de ton exercice. Peux tu la reformuler autrement, et de manière précise ? :happy3:
A.h
#include "B.h"
void sayHello(){ callB(); }

B.h
#include "A.h"
void callB(){ //doing nothin' }
void someOtherFunction(){ sayHello(); }

A.c
#include "A.h"
int main(){ sayHello(); }


Là, tu as une double inclusion B.h dans A.h et A.h dans B.h, mais le fichier principal A.c ne fait appel qu'aux headers de A.h
Je suis rouillé, je ne sais pas quoi faire, ni où est le problème. Je viens juste de débuter en ça. :hum:

Merci d'avance pour ton aide. :happy3:

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 01 Mar 2014, 19:03

ben appliques comme je l'ai fait au premier poste.
A.c
ya écrit #include A.h

donc on lit A.h
ya écrit #include B.h

donc on lit B.h
ya écrit #include A.h

donc on lit A.h
ya écrit #include B.h
...

Bref, tu vois que on tourne en rond.
Comment faire pour pas tourner en rond, c'est la question que je te pose. Enfin c'est pas tellement une question, mais c'est à celle la que répondent les ifndef par exemple, donc t'as tout intérêt à te la poser!
la vie est une fête :)

barbu23
Membre Transcendant
Messages: 5466
Enregistré le: 18 Fév 2007, 17:04

par barbu23 » 01 Mar 2014, 21:14

Voici ce que je pense :

A.c
# include A.h

# ifndef FATAL_ERROR
# define FATAL_ERROR
void sayHello(){ callB(); }
# endif // le fichier B.h qui contient void sayHello(){ callB(); } ne sera pas inclus, non ?

int main(){
sayHello();
}

non ? :mur:

Merci d'avance pour ton aide. :happy3:

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 01 Mar 2014, 21:47

A.c
# include A.h

# ifndef FATAL_ERROR
# define FATAL_ERROR
void sayHello(){ callB(); }
# endif // le fichier B.h qui contient void sayHello(){ callB(); } ne sera pas inclus, non ?

int main(){
sayHello();
}

ben déjà, il se passe quoi quand tu includes A.h.
la vie est une fête :)

barbu23
Membre Transcendant
Messages: 5466
Enregistré le: 18 Fév 2007, 17:04

par barbu23 » 01 Mar 2014, 21:50

Quant j'inclus le fichier A.h dans le fichier A.c, les headers de A.h qui sont : void sayHello(){ callB(); }; ( un seul header ) s'affiche à la place de # include "A.h" après compilation.

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

par fatal_error » 02 Mar 2014, 09:44

Quant j'inclus le fichier A.h dans le fichier c.h, les headers de A.h qui sont : void sayHello(){ callB(); }; ( un seul header ) s'affiche à la place de # include "A.h" après compilation.


1: nous n'avons jamais parlé de c.h pourquoi l'invoquer ici.
2: non les headers de A.h ne sont pas void... revoir le vocabulaire
3: non après compilation on ne voit pas des headers.

Ca sert à rien d'essayer comprendre c'est quoi les directives si tu connais pas à peu près la chaine de compilation.
la vie est une fête :)

barbu23
Membre Transcendant
Messages: 5466
Enregistré le: 18 Fév 2007, 17:04

par barbu23 » 02 Mar 2014, 13:51

Je m'excuse, j'ai corrigé mon message précédent. :happy3:
( J'ai remplacé c.h par A.c ) :happy3:

barbu23
Membre Transcendant
Messages: 5466
Enregistré le: 18 Fév 2007, 17:04

par barbu23 » 04 Mar 2014, 19:51

svp, j'ai besoin de votre aide. :happy3:

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 9 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite