228 votes

Créer son propre fichier d'en-tête en C

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.

31 votes

Avez-vous lu un livre d'introduction au C ? En voici un en ligne : publications.gbdirect.co.uk/c_book .

391voto

Oli Charlesworth Points 148744

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

2 votes

@Anu : Je ne peux pas le lire dans ce format. Vous pourriez modifier votre question originale pour inclure ce code.

3 votes

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.

6 votes

@Jeyekomon : Eh bien, où es le problème ?

37voto

Flavius Points 6115
#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;
}

10voto

TommyGunn32 Points 442

Monfichier.h

#ifndef _myfile_h
#define _myfile_h

void function();

#endif

monfichier.c

#include "myfile.h"

void function() {

}

0 votes

void function(); en tant que déclaration n'empêche pas des appels comme function(42); . Utilisez void en el déclaration comme void function(void);

8voto

djsumdog Points 439

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;
}

0 votes

"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.

0 votes

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.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