Headers


Sommaire

Comment crée un header sécurisé ?

Sécuriser un header (.h) ne veux pas dire le rendre sur au sens sécurité informatique, mais plutôt éviter qu’il sois inclus plusieurs fois au moment de la compilation.

Pourquoi sécuriser un fichier header ?

Lorsqu’un fichier .h est inclus dans plusieurs modules, le compilateur remplace chaque #include par le contenu complet du fichier, ce qui peut créer des redéfinitions si le header est inclus plusieurs fois.

Les gardes d’inclusion

Pour éviter cela, on “sécurise” le header avec des gardes d’inclusion : Imaginons que le fichier s’appelle : “mon_header.h”

#ifndef MON_HEADER_H
#define MON_HEADER_H
	// Contenu du header
#endif

Ces directives conditionnelles garantissent que le contenu du fichier n’est compilé qu’une seule fois, même s’il est inclus à plusieurs reprises.

Directive Définition
IFNDEF Vérifie si une macro n’a pas encore été defini (IFNDEF = If not defined)
DEFINE Défini la macro si elle n’a pas été définie (si elle est déjà définie le bloc est ignoré)
ENDIF Indique la fin du bloc conditionnel

De quoi est composé un fichier header en C ?

Un fichier header (.h) regroupe les déclarations et définitions nécessaires au bon découplage du code source.

Il améliore la réutilisabilité et la lisibilité du projet.

Prototype de fonctions

void ma_fonction(void);

Constantes et macros

#define PI 3.14159 //Definition d'un int
#define CHAINE "Ceci est une chaine de char" //Definition d'une chaine de char
#define ADD(a, b) (a + b) //Fonction basique qui retourne a + b
#define IS_NEGATIVE(nb) (nb < 0 ? 1 : 0) //Fonction avec conditions (ternaire)

Déclaration de variable externes

extern int compteur_global;

Inclusion d’autres headers

#include <unistd.h>

Déclaration de structures, unions, énumération

typedef struct s_maStruct
{
		int a;
		int b;
} t_maStruct;

Explications :

La syntaxe ci-dessus permet de définir une structure et de crée un alias de type via le mot-clé typedef

typedef // Sert a crée l'alias
struct s_maStruct // Nom "tag" de la structure
t_maStruct // Nom de l'alias

Afin d’amélioré la lisibilité et de simplifier le code on peux declarer des variables comme ceci :

t_maStruct variable1;

// A la place de :
struct s_maStruct variable1;
Comment utiliser / manipuler une structure ?

Pour utiliser les éléments d’une structure il faut donc obligatoirement déclarer une variable (instance).

Exemple :

void maFonction(void)
{
	t_maStruct var;
	
	var.a = 1;
	var.b = 2;
}

La variable de type “t_maStruct” contient les éléments de la structure défini. Nous utilisons donc “var” pour manipuler les éléments.

Exemple d’un header complet

#ifndef MON_HEADER_H
#define MON_HEADER_H

#define PI 3.14159 //Definition d'un int
#define CHAINE "Ceci est une chaine de char" //Definition d'une chaine de char
#define ADD(a, b) (a + b) //Fonction basique qui retourne a + b
#define IS_NEGATIVE(nb) (nb < 0 ? 1 : 0) //Fonction avec conditions (ternaire)

#include <unistd.h>

extern int compteur_global;

void maFonction(void);

typedef struct s_maStruct
{
	int a;
	int b;
} t_maStruct;

#endif
Partager :

Articles similaires

Makefiles

Makefiles

Comment créer et utilise un makefile ? C’est quoi un makefile ? Make sert a gérer les exécutable et la compilation de programmes, make est très efficace pour les gros projets car il permet de recompiler uniquement ce qui a été modifié.

Lire la suite
Les listes chainées

Les listes chainées

Les listes a la base n’existe pas en C, elles sont le résultat d’une manipulation de pointers et de structures.

Lire la suite