Rédaction : Commençons par quelques généralités.
Si vous voulez que votre librairie soit réutilisable et efficace, vous devez respecter quelques notions fondamentales
de la programmation.
- Limitez au minimum les variables globales. Préférez, lorsque c'est possible, de passer des paramètres
au fonctions plutôt que d'utiliser les variables globales. C'est plus facile de s'y retrouver et ça occuppe
moins de mémoire.
Par exemple, si vous avez une fonction qui traite les données d'un tableau dont vous devez connaitre
le nombre d'éléments :
Pas Bien !
|
Cette solution fait appel à une variable globale pour connaitre la taille du tableau. C'est déconseillé !
|
/*
* ...
*/
int tailleTab;
long * traiteTab (long * tab) {
/*
*
* Traitement des données
*
*/
}
/*
* ...
*/
|
Bien !
|
Ici, la taille du tableau est passée en paramètre à la fonction. C'est mieux !
|
/*
* ...
*/
long * traiteTab (long * tab, int tailleTab) {
/*
*
* Traitement des données
*
*/
}
/*
* ...
*/
|
- Commentez vos sources ! Comment voulez vous vous y retrouver rapidement dans le code de quelqu'un d'autre
ou même le vôtre si il n'y a aucun commentaire ? Celà est surtout vrai pour les fichiers d'en tête, expliquez
ce que font les fonctions et ce que sont les arguments. (Je sais, c'est moins chiant à dire qu'à faire)
- Evitez le plus possible les structures spécifiques à une application particulière. Par exemple, si vous
utilisez des chaines de moins de 50 caractères dans votre application, ne limitez pas vos variables à cette
valeur. Qui sait si votre patron ne va pas décider dans deux jours que les chaînes doivent pouvoir
comporter 1000 caractères ? (Je vous jure que ça arrive ! ;-) ). Préférez toujours, quand c'est possible,
une allocation dynamique de mémoire à vos variables. (voir malloc(), realloc(); calloc() et free())
- Lorsqu'on utilise des fichiers d'en têtes abondamment, il y a un risque d'en inclure un plusieurs
fois, ce qui allonge le temps de compilation et produit éventuellement des erreurs. pour pallier à ce problème,
on utilise la clause #ifndef __NOM_FICHIER_H.
Par exemple, si votre fichier s'appelle monTest.h, placez ceslignes au début et à la fin du fichier:
Si le fichier à été inclus, _MON_TEST_H est défini et il ne le sera pas à nouveau.
|
#ifndef _MON_TEST_H
#define _MON_TEST_H 1
/*
* ...
*ici, le contenu normal du fichier monTest.h
* ...
*/
#endif
|
Les "chemins"
La directive #include
: pour inclure un fichier dans un autre en c,
on utilise la directive
#include
.
On spécifie le chemin relatif entre le fichier incluant et le fichier inclus, par exemple :
#include "mesH/monTest.h"
ou bien on place le fichier .h dans le répertoire ou le compilateur s'attend à trouver les fichiers .h.
(regardez dans /usr/include par exemple) et on donne le chemin relatif par rapport à ce répertoire, par exemple :
#include <orb/orbit.h>
Nota Bene : On peut également spécifier d'autres chemins de recherche grâce à l'option -I de gcc,
par exemple, pour y inclure le répertoire courant :
gcc -I. etc...
Pour devenir incollables sur ces amusantes petites choses, apprenez par coeur les man pages de gcc et ld. ;-)
Plus d'infos sur cette page ?
Consultez les pages man des fonctions d'allocation dynamique de mémoire, du compilateur, du linker
et celles qui y sont conseillées et tapant dans la console :
man malloc
man realloc
man calloc
man free
man gcc
man ld
a+