La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Inclusions & dépendances. C compile texte > objet int main () … 0110010101010 1010101010100 1010101010001 0101010101000 1000001100.

Présentations similaires


Présentation au sujet: "Inclusions & dépendances. C compile texte > objet int main () … 0110010101010 1010101010100 1010101010001 0101010101000 1000001100."— Transcription de la présentation:

1 Inclusions & dépendances

2 C compile texte > objet int main () … 0110010101010 1010101010100 1010101010001 0101010101000 1000001100

3 Cas de fichiers multiples int main () { toto() } … 0110010101010 1010101010100 10Calltoto1010 1010101000100 0001100 void toto () … Icitoto01100101 0101010101010 1010010101010 1000101010101 0100010000011 00 toto est inconnu 0110010101010 1010101010100 1000110011010 1010101000100 0001100 Icitoto01100101 0101010101010 1010010101010 1000101010101 0100010000011 00 Édition de liens: résout les adresses et crée l’exécutable 0011001

4 La résolution des adresses se fait par le nom de l’objet float toto; …. toto=-1.0; extern int toto; Format IEEE: signe(1), exposant(8) 1.mantisse 1 01111111 00000000000000000000000 Compilation et édition de liens fonctionnent, mais l’entier toto vaut 3212836864. Aucune erreur signalée

5 Fonctions repérées par leur seul nom int toto (float arg) { …/* définition */ }; float toto (float arg1, char arg2); … X = toto (2.3, ‘A’); La fonction sera appelée avec le mauvais nombre d’arguments (plantages à cause de mauvaise gestion de la pile) et les mauvais types d’arguments (données incohérentes). Aucune vérification.

6 Un outil et une pratique Un outil: lint. Voir docs diverses. Analyse statique des codes des sources et warnings divers si incohérence. Une pratique: faire un jeu de fichiers (extension.h par convention) qui seront inclus en tête des fichiers à compiler et forceront les vérifications.

7 Règles d’exportation - Tout fichier.c qui exporte des objets a un.h de même nom, et l’inclut par #include "toto.h " (si le chemin est absolu ou relatif) ou par #include (si le chemin est conventionnel, défini par une variable système) toto.c toto.h #include " toto.h " extern float fff; float fff = 2.0; int machin (char * s); int machin (char * s) { ……. } - Toute variable exportée (utilisée hors du fichier qui la définit) doit être déclaré « extern » dans le.h et définie dans le.c. - Toute fonction exportée doit être déclarée dans le.h et définie dans le.c

8 toto.c #include " toto.h " Règles d’importation Tout fichier qui se sert d’objets externes inclut le.h du module qui les définit. client.c toto.h #include " toto.h " Ainsi toute utilisation fautive ou redéclaration d’une variable sera vue par le compilateur. extern float fff; De même pour une utilisation erronée, ou une redéclaration d’une fonction int machin (char * s); char fff; fff=‘A’; machin(2.3);

9 Bénéfices Le.h déclare un objet Le.c correspondant inclut son propre.h et donc s’oblige à définir les objets déclarés conformément à leur déclaration dans le.h sinon erreur. Les clients incluent le.h et donc s’obligent à utiliser les objets conformément à leur déclaration sinon erreur. L’édition de liens va donc s’occuper de définitions cohérentes avec leur utilisation

10 Dangers Rien n’est vérifié par le compilateur: c’est une question de discipline! Hélas le compilateur prend des options par défaut quand il tombe sur une fonction non déclarée et la déclare « pour vous ». Le #include fait effectivement et physiquement une inclusion: aucune magie ne fait que le compilateur se souviendrait d’où viennent les portions de textes qu’il compile ensuite. En particulier ne pas oublier le « extern » dans les déclarations de variables: sinon résultats non définis, la variable étant déclarée (avec son adresse et la place mémoire réservée) dans plusieurs modules ensuite reliés par l’édition de liens!

11 Make Cible: dépendances commande shell La liste de dépendances pour construire la cible avec la commande shell contient en général: les fichiers utilisés directement par la commande et les fichiers.h utilisés toto : toto.c utils.c utils.h gcc toto.c utils.c -o toto Bref la construction d’un Makefile est un problème en soi nécessitant l’inspection des sources. Corrolaire: ne pas cacher les #include au milieu des fichiers.c, les mettre en tête!

12 Inclusions transitives Un fichier inclus peut lui-même en inclure d’autres. Par exemple une fonction exportée utilise le type FILE: on peut préférer inclure stdio.h dans toto.h (plutôt que dans toto.c avant l’inclusion de toto.h, ce qui crée une contrainte d’utilisation). On peut se retrouver avec des combinaisons compliquées où le même fichier est inclus plusieurs fois. Une technique utilisant le préprocesseur (utilisée dans les fichiers.h standard). #ifndef TOTO_DEJA_INCLU #define TOTO_DEJA_INCLU (ici les déclarations qui ne seront lues qu’une fois même si le fichier est inclus 10 fois) #endif


Télécharger ppt "Inclusions & dépendances. C compile texte > objet int main () … 0110010101010 1010101010100 1010101010001 0101010101000 1000001100."

Présentations similaires


Annonces Google