2009-07-29 7 views
21

J'essaie de m'enseigner moi-même la programmation C et j'utilise DevC++ pour mon IDE sous Windows XP. Je suis un peu confus sur la façon correcte d'appeler mes propres fichiers d'en-tête.Fichiers d'en-tête C - façon correcte d'inclure

J'ai mon fichier source appelé main.c et un fichier séparé pour les fonctions appelé myFunctions.c que je comprends dans main.c en utilisant « Include « myFunctions.h » avec tous mes prototypes de fonctions résidant dans cet en-tête fichier.

myFunctions.c contient deux fonctions appelées showDate() et une appelée showScreen() et les deux fonctions peuvent être appelées depuis main.call bien. Mes problèmes ont commencé quand j'ai essayé d'appeler showDate() depuis showScreen() et pendant la compilation/liaison, il se plaignait parce que je n'avais pas de prototype dans myFunctions.c pour showDate().

Ce que je veux savoir, c'est lequel des éléments suivants dois-je faire?

  1. comprennent "myFunctions.h" à l'intérieur myFunctions.c

  2. Déclarer le prototype dans les deux myFunctions.h et myFunctions.c
  3. Déclare le prototype en seulement myFunctions.c seulement

Tout ce qui précède semble corriger l'erreur du compilateur et me permettre d'appeler la fonction bot à partir de main.c et myFunctions.c mais je ne peux pas trouver une source définitive dont la procédure correcte.

Répondre

24

Utilisez # 1 - #include dans de nombreux endroits.

Ne jamais utiliser # 2 - ne jamais déclarer quoi que ce soit plus d'une fois.

Utilisez rarement # 3 - déclarez quelque chose dans un fichier .c comme si vous n'alliez jamais le réutiliser.

+6

Peut-être envisager la visibilité avant de choisir entre # 1 et # 3. Utilisez # 1 si vous avez besoin d'appeler cette fonction à partir d'un autre fichier .c. Utilisez # 3 si la fonction n'est pas nécessaire ailleurs qu'en dehors du fichier local. De cette façon, vous réduisez l'encombrement dans vos fichiers d'en-tête et vous pouvez vraiment les utiliser comme définition d'interface. –

+4

Droite. Les fonctions appelées d'ailleurs doivent être dans le fichier .h. Les fonctions internes doivent être déclarées statiques et prototypées dans le fichier .c. Cela donne à C une modularité bien nécessaire. –

2

Vous devez choisir l'option 1. Ou ordonner myfunctions.c afin que la définition de la fonction appelée se produise avant la fonction qui l'appelle. En incluant l'en-tête dans le fichier, vous autorisez le compilateur à intercepter toute incompatibilité entre la déclaration et la définition.

7

Le fichier d'en-tête doit contenir les prototypes. Vous l'incluez ensuite partout où ces prototypes sont utilisés, y compris le fichier .c qui contient les définitions de fonctions. BTW DecC++ n'est plus activement développé - vous devriez plutôt envisager de passer à Code::Blocks à la place.

+0

Merci Neil, je vais regarder dans Code :: Blocks un peu plus tard –

+1

Code :: Block est fantastique - la première chose que j'ai remarqué était Code Folding qui était quelque chose que je voulais vraiment dans DevC++ Cheers Neil! –

3

Certainement la première option.

1

Comme tout le monde l'avait déjà dit, vous devriez utiliser la première option. La règle générale est que les prototypes de fonctions résident dans des fichiers .h et leurs implémentations dans des fichiers .c.