Comment faire pour déplacer les fonctions C en fichier séparé?
Je suis arriver a commencé avec la programmation en C. J'ai actuellement un gros fichier qui contient beaucoup de fonctions. Je voudrais déplacer ces fonctions à un fichier séparé, de sorte que le code est plus facile à lire. Cependant, je n'arrive pas à comprendre comment inclure/compiler et ne peut pas trouver un exemple dans l'un des tutoriels en ligne que j'ai trouvé. Voici un exemple simplifié:
#include <stdlib.h>
#include <stdio.h>
void func1(void) {
printf("Function 1!\n");
}
void func2(void) {
printf("Function 2!\n");
}
int main(void) {
func1();
func2();
return 0;
}
Comment déplacer les fonctions C dans un fichier séparé? Pour info: je suis en utilisant gcc.
Mise à jour: Ces réponses sont très utiles, merci. Maintenant, il semble que mon exemple simplifié n'est pas assez bon parce que j'ai compris la raison de mon programme réussi à compiler est parce que je suis en utilisant une variable globale dans mes fonctions.
#include <stdlib.h>
#include <stdio.h>
int counter = 0;
void func1(void) {
printf("Function 1!\n");
counter++;
}
int main(void) {
func1();
return 0;
}
Déplacement de ces fonctions dans un fichier externe ne fonctionne pas parce qu'ils ont besoin de faire référence à cette variable globale:
#include <stdlib.h>
#include <stdio.h>
#include "functions.c"
int counter = 0;
int main(void) {
func1();
counter = 100;
return 0;
}
Comment puis-je résoudre ce problème?
main()
. Vous aurez maintenant besoin pour compiler et lier chaque fichier source, en écrivant quelque chose comme gcc -o program main.c functions.c
.Voir: Ce qui est une bonne référence de documenter les modes d'utilisation de
.h
fichiers en C? et dois-je utiliser #include
dans les en-têtes? pour des informations connexes.Merci @JonathanLeffler
Je suppose que je dois aussi le point de ce que l'on appelait Quelles sont
extern
les variables en C?, qui est axée principalement sur des variables plutôt que des fonctions, mais il contient également un peu (beaucoup) de l'information, beaucoup de utile.
OriginalL'auteur Andrew | 2013-11-01
Vous devez vous connecter pour publier un commentaire.
D'accord. Ici nous allons.
Votre principal.c fichier
Votre fonctions.h fichier
Votre fonctions.c fichier
Le compiler avec:
#include "functions.c"
. Pourquoi devrais-je créer un fichier d'en-tête?Vous pouvez ainsi créer l'en-tête parce qu'en général, vous avez plus d'un fichier source à l'aide des fonctions (de sorte que comme
main.c
il est égalementaux.c
...) et ils ne peuvent pas tous utiliser le#include "func1.c"
tromper; seul l'un des fichiers source peuvent le faire, mais les autres doivent encore les déclarations de fonction, si vous avez besoin d'un en-tête.oui. mais, c'est une bonne pratique d'inclure le fichier d'en-tête, de sorte que vos déclarations globales de tous y va et que ton code a l'air bon.et d'accord avec Jonathan Leffler.
C'est une bonne idée d'inclure les fichiers d'en-tête, mais il est mauvais d'avoir le fichier d'en-tête inclure le fichier source depuis que de défaites le but d'avoir un distinct fichier d'en-tête.
Dans votre exemple vous d'inclure les prototypes de fonction après la définition d'une fonction qui, dans la plupart des cas, le fait même de la création d'un prototype de fonction de raison d'être.
OriginalL'auteur Raju Kunde
La façon la plus courante consiste à placer vos prototypes de fonction dans un fichier d'en-tête et de vos implémentations de fonction dans un fichier source. Par exemple:
func1.h
func1.c
func2.h:
func2.c:
principal.c:
Vous pouvez alors compiler à l'aide de l'suivantes:
J'ai seulement mis une fonction au sein de chaque source/en-tête de la paire pour l'illustration. Vous pourriez créer un en-tête qui comprend les prototypes pour tous les fichiers source, ou vous pouvez créer plusieurs fichiers d'en-tête de chaque fichier source. La clé est que n'importe quel fichier source qui va appeler la fonction, doit inclure un fichier d'en-tête qui comprend le prototype de la fonction.
En règle générale, vous voulez seulement un fichier d'en-tête inclus une fois, c'est le but de la
#ifndef #define #endif
macros dans les fichiers d'en-tête.J'ai mis à jour les exemples de l'utilisation partagée
int
variable.Notez que ni
func1.h
nifunc2.h
doit inclure<stdio.h>
de faire la déclaration dans le fichier de compilation, de sorte que le imbriquée inclure devrait être laissé de côté. Les en-têtes doivent être idempotent (comme la vôtre, en raison de l'en-tête des gardes) et autonome. Les vôtres sont autonomes, mais elles comprennent inutiles des en-têtes de ce qui est sous-optimale. Voir dois-je nous e#include
dans les en-têtes?Bien que, techniquement, c'est vrai, je l'ai trouvé, il est préférable d'inclure les fichiers d'en-tête nécessaires pour prétraiter la la nouvelle en-tête que d'exiger que les fichiers sources qui l'appellent de le faire. Un grand exemple de ceci serait notamment stdint.h pour l'utilisation de la largeur de types tels que uint32_t et un uint64_t.
Si les fonctions dans l'en-tête types d'utilisation de
<stdint.h>
, vous devez inclure<stdint.h>
dans l'en-tête. Votre les en-têtes doivent être à la fois autonome et idempotent. C'est l'auto-confinement requis: vous devez être en mesure d'utiliser l'en-tête sans avoir à inclure quoi que ce soit d'autre. Idempotence est réalisé par la tête des gardes, y compris l'en-tête deux fois, de façon délibérée, ou plus généralement par coïncidence ou par accident) ne devrait pas causer de problèmes. Voir les offres liées à précédemment pour les détails.OriginalL'auteur David M. Syzdek
Vous devez d'abord apprendre la différence entre un déclaration et définition. Une déclaration indique au compilateur que quelque chose, comme une fonction, existe. Une définition est, pour le cas des fonctions, la fonction réelle mise en œuvre.
Donc, ce que vous avez à faire est de déplacer la définition d'un autre fichier, mais d'ajouter une déclaration dans le fichier où la fonction est appelée. À vous ensuite de créer les deux fichiers ensemble, et le compilateur et l'éditeur de liens prendra soin du reste.
Merci, fixe.
Merci, bon à savoir ces termes.
OriginalL'auteur Some programmer dude
Vous pouvez faire deux fichiers: l'un avec la fonction principale, et une autre avec les autres.
Si votre fonction dans un autre fichier utilise une variable globale à partir d'un autre module/fichier, vous devez ajouter "extern" devant la déclaration de variable globale dans le module avec la définition de la fonction. Elle indique au compilateur que vous avez accès à une variable globale à partir d'un autre fichier.
Ce qui suit est un exemple de cas où une variable globale, "x", est défini et une fonction "mafonction, est appelé dans la main.c fichier. "myfunction" est défini dans les fonctions.c fichier. "x" doit également être déclarée dans les fonctions.c fichier, mais comme il sera accédant à "x" à partir d'un autre fichier, il faut avoir une "extern" en face d'elle. "myfunction" prend de l'externe variable globale "x", il incrémente par l'un et l'imprime. Considérons le code suivant:
principal.c aura l'air quelque chose comme:
fonctions.c ressemblera à quelque chose comme:
Noter que les principaux.c utilise "int x;" déclarer x alors que les fonctions.c utilise "extern int x" pour déclarer x.
Pour compiler le code, assurez-vous que les deux fichiers sont dans le même dossier et de compiler tout comme vous le feriez si vous n'aviez qu'un seul fichier. Par exemple, si vous utilisez gcc sur un système linux et gcc, votre entrée de ligne de commande ressemblera à:
La première ligne compile le code, et la deuxième ligne de l'exécute. La sortie devrait ressembler à:
La valeur de x dans la fonction myfunction est: 2
La valeur de x dans la principale est: 2
Noter que la Valeur de "x" est également changé de main en tant que "x" est une variable globale.
OriginalL'auteur Aniq Ahsan
Vous pouvez faire quelque chose comme cela.
-1: Désolé, mais...y Compris
.c
fichiers source est possible, dans certains cas, mais pas de sens dans la plupart des cas. (Cela fonctionne ici, mais ne peut pas être recommandée, même si elle fonctionne.) Plus précisément, si vous avez deux fichiers,main.c
etaux.c
(parties d'un même programme) que les deux nécessaires à l'utilisation defunc1()
etfunc2()
, vous ne pourriez pas utiliser cette technique dans les deux fichiers. Vous auriez besoin d'un en-tête de déclarer les fonctions à utiliser dans au moins un des fichiersmain.c
etaux.c
. De sûr, vous devriez avoir l'en-tête et de les inclure dans tous les fichiers sources (main.c
,aux.c
,func1.c
etfunc2.c
).OriginalL'auteur Douglas Franco