3 votes

Inclure des fichiers d'en-tête plus d'une fois

#include 
#include 

int main ()
{
   printf ("hello world");
   return 0;
}

Lorsque je compile cela, le compilateur ne donne aucun avertissement/erreur pour avoir inclus stdio.h deux fois. Pourquoi en est-il ainsi? Les fonctions scanf, printf etc. ne sont-elles pas déclarées et définies deux fois maintenant?

Merci d'avance

11voto

Mark Tolonen Points 32702

Typiquement, les fichiers d'en-tête sont écrits de manière similaire à l'exemple ci-dessous pour éviter ce problème :

#ifndef MYHEADER
#define MYHEADER

...

#endif

Ensuite, s'ils sont inclus plus d'une fois, la deuxième instance passe le contenu.

2voto

caf Points 114951

En plus de l'utilisation des gardes d'inclusion, comme indiqué dans la réponse de Mark Tolonen, il n'y a aucun problème avec la déclaration d'une fonction plus d'une fois, tant que les déclarations sont compatibles. C'est parfaitement acceptable:

int foo(int, char *);
int foo(int a, char *p);
extern int foo(int x, char y[]);

En fait, étant donné que chaque définition est également une déclaration, chaque fois que vous "déclarez en avant" une fonction déclarée dans le fichier même, vous déclarez la fonction deux fois.

Ce qui n'est pas correct, c'est de créer de multiples définitions externes d'une fonction; mais les fichiers d'en-tête bien écrits ne devraient pas créer de définitions externes - seulement des déclarations. La (unique) définition des fonctions printf et scanf devrait se trouver dans un fichier objet, qui est lié à votre programme lors de sa construction.

0voto

Satya Points 2222

Non, les fichiers d'en-tête définissent généralement un drapeau, puis utilisent #ifndef pour s'inclure uniquement si le drapeau n'était pas défini.

Ouvrez-en un pour voir.

-4voto

davep Points 178

En passant, utiliser le tour de "#ifndef" est approprié pour les en-têtes utilisés par d'autres personnes (comme les en-têtes standard).

Si vous avez besoin du #ifndef pour un programme "privé", alors vous le faites "mal". Autrement dit, vous pouvez et devez organiser les en-têtes au sein d'un projet de manière à ce qu'ils ne soient pas inclus plus d'une fois.

Une raison pour laquelle cela est utile est que cela empêche les en-têtes que vous pensez avoir supprimés de réapparaître.

Puisque vous ne pouvez pas contrôler comment les en-têtes publics sont utilisés, ce tour est raisonnable pour les en-têtes publics. Ce tour est complètement inutile pour les en-têtes privés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X