Quelqu'un peut-il expliquer comment créer un fichier d'en-tête en C avec un exemple simple du début à la fin.
@Anu : Je ne peux pas le lire dans ce format. Vous pourriez modifier votre question originale pour inclure ce code.
Quelqu'un peut-il expliquer comment créer un fichier d'en-tête en C avec un exemple simple du début à la fin.
foo.h
#ifndef FOO_H_ /* Include guard */
#define FOO_H_
int foo(int x); /* An example function declaration */
#endif // FOO_H_
foo.c
#include "foo.h" /* Include the header (not strictly necessary here) */
int foo(int x) /* Function definition */
{
return x + 5;
}
main.c
#include <stdio.h>
#include "foo.h" /* Include the header here, to obtain the function declaration */
int main(void)
{
int y = foo(3); /* Use the function here */
printf("%d\n", y);
return 0;
}
Pour compiler avec GCC
gcc -o my_app main.c foo.c
@Anu : Je ne peux pas le lire dans ce format. Vous pourriez modifier votre question originale pour inclure ce code.
Il convient de noter que ce code ne fonctionne pas si vous essayez de le construire simplement à l'aide d'un bouton ("build and run" dans Code::Blocks par exemple). Cela peut sembler évident pour vous, mais pour moi, c'est la première fois que cela se produit et il m'a fallu un certain temps pour comprendre où est le problème.
#ifndef MY_HEADER_H
# define MY_HEADER_H
//put your function headers here
#endif
MY_HEADER_H
sert de protection contre la double inclusion.
Pour la déclaration de la fonction, il suffit de définir la signature, c'est-à-dire sans les noms des paramètres, comme ceci :
int foo(char*);
Si vous le souhaitez vraiment, vous pouvez également inclure l'identifiant du paramètre, mais ce n'est pas nécessaire car l'identifiant ne serait utilisé que dans le corps d'une fonction (implémentation), ce qui n'est pas le cas dans l'en-tête (signature du paramètre).
Ce site déclare la fonction foo
qui accepte un char*
et renvoie un int
.
Dans votre fichier source, vous auriez :
#include "my_header.h"
int foo(char* name) {
//do stuff
return 0;
}
Les fichiers d'en-tête contiennent les prototypes des fonctions que vous définissez dans un fichier .c ou .cpp/.cxx (selon que vous utilisez c ou c++). Vous voulez placer des #ifndef/#defines autour de votre code .h de sorte que si vous incluez le même .h deux fois dans différentes parties de vos programmes, les prototypes ne sont inclus qu'une seule fois.
client.h
#ifndef CLIENT_H
#define CLIENT_H
short socketConnect(char *host,unsigned short port,char *sendbuf,char *recievebuf, long rbufsize);
#endif /** CLIENT_H */
Ensuite, vous implémentez le .h dans un fichier .c comme ceci :
client.c
#include "client.h"
short socketConnect(char *host,unsigned short port,char *sendbuf,char *recievebuf, long rbufsize) {
short ret = -1;
//some implementation here
return ret;
}
"de sorte que si vous incluez le même .h deux fois dans différentes parties de vos programmes, les prototypes ne sont inclus qu'une seule fois". C'est trompeur. Ils évitent d'inclure deux fois le même fichier d'en-tête. à partir du même fichier source (inclure un en-tête deux fois dans deux fichiers source différents est acceptable, et généralement nécessaire !) et redéclarer les prototypes de fonction n'est pas un problème, la redéfinition des types et des variables globales est ce dont il faut se méfier.
Cela n'est pas tout à fait intuitif pour moi - peut-être cela a-t-il plus à voir avec l'implémentation spécifique du pré-processeur que je dois comprendre. Pourquoi les #ifndef
y #define
utilisées dans le code source des fichiers de la bibliothèque (c'est-à-dire, foo.c
dans l'exemple ci-dessus) plutôt que dans le fichier d'en-tête de cette bibliothèque ? Est-ce parce que le compilateur sait qu'il n'a qu'une seule définition réelle pour la bibliothèque foo.c
?
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.
31 votes
Avez-vous lu un livre d'introduction au C ? En voici un en ligne : publications.gbdirect.co.uk/c_book .