Bonjour!
est-ce qu'il est possible d'inclure un fichier par exemple fichier1.c dans un fichier2.c comme on pourrait inclure un fichier.h??
Si oui, quelle serait la syntaxe d'inclusion?
Merci d'avance!!
Version imprimable
Bonjour!
est-ce qu'il est possible d'inclure un fichier par exemple fichier1.c dans un fichier2.c comme on pourrait inclure un fichier.h??
Si oui, quelle serait la syntaxe d'inclusion?
Merci d'avance!!
La syntaxe l'interdit pas mais c'est tres gore comme pratique.
Si tu veux utiliser des fonctions qui sont definies dans un autre module .c, il faut avoir un .h correspondant qui déclare ces fonctions et ensuite inclure ce .h.
Merci pour la reponse..mais ça ne m'avance pas tellement ..En fait nous avons un projet en programmation avancée et il ya beaucoup de fichier à inclure notamment celui contenant les fonctions qui est à inclure dans le menu principal..
Et en fait ya notre prof qui insiste sur les inclusions avec les fichiers.C mais il ne nous en a pas dit plus.
:google2: compilation séparée
http://www-ic2.univ-lemans.fr/~aliss...ix/node61.html
Je dirais même plus ;) :Citation:
Envoyé par Gruik
http://emmanuel-delahaye.developpez.....htm#organiser
Bonjour!!
Merci pour les liens...Je crois que j'ai à peu pres compris ce qu'il fallait faire..D'apres ce que j'ai lu les icnlusions ne se font qu'avec des fichiers.h ....
Mais j'ai pas tres bien compris le principe de la compilation séparée....:? ..
Serait-ce une autre façon d'utiliser un makefile?
Help!!:(
Merci ...
Salut,
Je dirais plutôt qu'un makefile est là pour automatiser la compilation séparée, mais il n'est pas nécessaire d'utiliser un makefile pour faire de la compilation séparée. Voici un exemple de compilation séparée à la main:
Tu devras inclure le fichier hello.h dans chaque fichier source où tu utilises la fonction affiche_hello(), ainsi que dans le fichier source où elle est définieCode:
1
2
3
4
5
6
7
8
9
10 /* fichier hello.h: c'est là que tu déclares tes fonctions */ /* garde contre contre les inclusions multiples */ #ifndef H_TC_HELLO_20061215140628 #define H_TC_HELLO_20061215140628 /* On déclare la fonction affiche_hello */ void affiche_hello(void); #endif /* fin de la garde H_TC_HELLO_20061215140628*/
Code:
1
2
3
4
5
6
7
8
9
10 /*fichier hello.c: ici, on définit la fonction affiche_hello() */ #include <stdio.h> /* Tu dois utiliser le fichier d'en-tête hello.c pour "lier" le fichier client (qui utilise les fonctions définie dans hello.h et le fichier de définition e.g. hello.c */ #include "hello.h" void affiche_hello(void) { printf("Hello developpez.com!\n"); }
Pour compiler tout cela, tu n'est pas obligé d'avoir un makefile (je suppose ici que tu utilises gcc en ligne de commande. Avec Code::Blocks, tout ce processus se fait de manière transparente):Code:
1
2
3
4
5
6
7
8
9
10 /* fichier main.c: ici, on utilise la fonction affiche_hello()*/ include <stdlib.h> #include "hello.h" /* On utilises la fonction, donc on inclut hello.h*/ int main(void) { affiche_hello(); return EXIT_SUCCESS; }
et maintenant, on fait l'édition des liens:Code:
1
2 gcc -c -o hello.o hello.c gcc -c -o main.o main.c
Lorsque le nombre de fichiers sources devient supérieur à 2, il devient intéressant de recourir à un makefile pour deux raisons:Code:gcc -o hello hello.o main.o
1) pas besoin de taper toutes les lignes de commande à la main
2) avec make, seuls les fichiers modifiés seront recompilés ainsi que ceux qui dépendent de ces fichiers. Par exemple, si tu modifies, le fichier main.c uniquement, tu n'as pas besoin de recompiler hello.c. make fait donc:
Voici comment écrire le makefile pour la compilation de ce micro-projet:Code:
1
2 gcc -c -o main.o main.c gcc -o hello hello.o main.o
Pour résumer, bien que l'utilisation d'une makefile soit la plupart du temps liée à la compilation séparée d'un projet (processus que make permet d'automatiser), le concept de compilation séparée est indépendant de make et mérite d'être étudié en détail lors de l'apprentissage du langage C, car il permet d'organiser un projet de façon efficace.Code:
1
2
3
4
5
6
7
8
9
10#Makefile hello: main.o hello.o <tab>gcc -o $@ $^ main.o: main.c hello.h <tab>gcc -c -o $@ $< hello.o: hello.c hello.h <tab>gcc -c -o $@ $<
Je suis surpris que le concept de compilation séparée n'aparaisse que dans un cours de programmation avancée. Je mettrais cela déjà dans un cours d'introduction au langage C.
Thierry
Si tu veux générer l'ensemble des dépendances automatiquement, je te donne une astuce qui n'est pas forcement connu (on le voit nul part) :Citation:
Envoyé par mujigka
Compile avec l'option -MM l'ensemble des tes fichiers c :
Bon là, ca parait ridicule car il n'y a que deux fichiers, mais ça peut être sympa quand il y en a plus.Code:
1
2
3
4
5
6 gcc -MM *.c fournit : main.o: main.c hello.h hello.o: hello.c hello.h
Enfin, si on fait de la compilation dans des dossiers séparés, ça ne marche plus :piou: A moins qu'il y ait une astuce que je ne connaisse pas.
Merci millie pour tes précisions. La gestion automatique des dépendances d'un projet est un problème intéressant. J'ai repris il y a un an un projet d'IDE appelé CWorkshop initié sur developpez.com (initialisé à l'époque par Franck Hecht) puis abandonné par la suite. Je travaille actuellement sur un gestionnaire de makefile et/ou SConstruct files (outils scons) et le problème des dépendances me cause quelques soucis. J'ai considéré utiliser le retour de gcc -MM dans ce projet, mais bon, je ne travaille qu'occasionnellement dessus.
Thierry
Salut millie
Pour un peu plus de precision:est-ce que la ligne de commande gcc -MM *.c compilerait tout un repertoire ne contenant que des fidhier .c ??
Non non, ça ne compile rien du tout (à cause de l'option MM).
Cela ne fait que donner (dans le terminal) les dépendances entre les fichiers (il n'ira voir que ceux qui finissent pas .c).
EDIT : Par exemple comme ça :
Code:
1
2
3
4
5
6
7
8
9
10 declaration.o: declaration.c declaration.h tabSymboles.h tabChaines.h interNum.o: interNum.c interNum.h tabSymboles.h tabChaines.h label.o: label.c label.h tabChaines.o: tabChaines.c tabChaines.h tabObjets.o: tabObjets.c tabObjets.h tabSymboles.o: tabSymboles.c tabSymboles.h tabChaines.h traitement.o: traitement.c tabSymboles.h tabChaines.h interNum.h \ declaration.h label.h traitement.h traitementExpr.o: traitementExpr.c tabSymboles.h tabChaines.h interNum.h \ declaration.h label.h traitement.h traitementExpr.h
ok merci pour la précision!!
C'est techniquement possible, mais c'est une pratique le plus souvent déplorable. Que veux tu faire exactement ?Citation:
Envoyé par landryx
Change de prof, et vite.Citation:
Envoyé par landryx
salut,
Je viens de faire un petit test (car j'ai appris avec plaisir cette astuce), si tu lance une commande du genre deCitation:
Envoyé par millie
il semble aller chercher dans l'ensemble des sous dossier que tu as indiqué...Citation:
$ gcc *.cpp dossier1/*.cpp dossier2/*.cpp
(par contre, il refuse un truc du genre de ./*/*.cpp)
Il devrait donc y avoir moyen pour "piper" un ls avec cette commande, et permettre de lui fournir l'ensemble des dossiers, non :question:
(enfin, étant sous windows, pour l'instant, et pour etre honnete, c'était la commande
Citation:
c:\mingw\bin\gcc.exe -MM *.cpp /dossier1/*.cpp
En fait, je pensais au dossier de sortie (ou se trouve les fichiers .o) :
Mais n'étant absoluement pas pro de Makefile :aie: (faut avouer que j'aime bien que Code::blocks me le fasse automatiquement), il y a peut être un moyen de ruser pour faire cela :mrgreen:Code:
1
2 $(OBJFOLDER)/tabObjets.o: ./src/tabObjets.c ./src/tabObjets.h $(CPP) $(CFLAGS) ./src/tabObjets.c -o $(OBJFOLDER)/tabObjets.o
Je changerai bien de prof mais je crois que je vais devoir me faire à celui que j'ai.Citation:
Envoyé par Emmanuel Delahaye
Sinon pour l'inclusion de fichiers j'ai finalement tout mis dans un fichier.h que j'ai inclus dans le fichier principal;c'est plus simple... Mais apres si il est possible d'inclure des fic.c serait-il possibme d'en avoir la syntaxe svp ? (à Emmanuel Delahaye)
HELP!!:(
merci d'avance
Rassure moi quand tu dis que tu as tout mis dans le fichier .h tu parles pas de code hein?Citation:
Envoyé par landryx
Pas de code dans un .h seulement inclusion, define, prototypes... Mais pas de code.
Ben pour include un .c c'est pareil que pour un .h. Si tu veux tu peux inclure n'importe quoi, tant que ce qu'il y a dedans est du C.
#include <fichier.dtc> ca fonctionne.
#include <fichier.lol> :mrgreen:Citation:
#include <fichier.dtc> ca fonctionne.
C'est possible d'include un fichier d'implémentation avec l'extension .c avec la même syntaxe qu'un fichier d'en-tête avec l'extension .h. En ce qui concerne ma maigre expérience en programmation, IL N'EST JAMAIS NECESSAIRE D'INCLURE UN FICHIER .c, de la même manière qu'IL EST FORTEMENT DECONSEILLE DE PLACER DU CODE DANS UN FICHIER D'EN-TETE. Les fichiers d'en-tête ne sont pas faits pour cela, mais sont réservés aux déclarations de prototypes de fonctions, définitions de macros, etc.Citation:
Envoyé par landryx
Thierry