Comment faire pour empêcher plusieurs définitions en C?
Je suis un C newbie et j'essayais simplement d'écrire une application de console avec Code::Blocks. Voici le (simplifié) du code:
principal.c:
#include <stdio.h>
#include <stdlib.h>
#include "test.c" //include not necessary for error in Code::Blocks
int main()
{
//t = test(); //calling of method also not necessary
return 0;
}
test.c:
void test() {}
Quand j'essaie de compiler ce programme, il donne les erreurs suivantes:
*chemin*\test.c|1|définition de plusieurs de `_ test"| obj\Debug\main.o:*chemin*\test.c|1|d'abord défini ici|
Il n'y a aucun moyen que je suis multiplier la définition de test (bien que je ne sais pas où le trait de soulignement est à venir à partir de) et il semble très improbable que la définition est en quelque sorte inclus deux fois. C'est tout le code, il est.
J'ai exclu que cette erreur est due à certains de nommage en conflit avec d'autres fonctions ou des fichiers appelés test ou de l'examen.c. Notez que la multiplicité et de la première définition sont sur la même ligne dans le même fichier.
Personne ne sait quelle en est la cause et ce que je peux faire à ce sujet? Merci!
Vous devez vous connecter pour publier un commentaire.
Vous compiler le code source de
test.c
deux fois:test.c
lui-même,main.c
qui comprend tous lestest.c
source.Ce dont vous avez besoin dans votre
main.c
afin d'utiliser letest()
fonction est une simple déclaration, pas sa définition. Cela est réalisé en incluant untest.h
fichier d'en-tête qui contient quelque chose comme:Cela informe le compilateur que cette fonction avec des paramètres d'entrée et le type de retour n'existe. Ce que cette fonction n' ( tout à l'intérieur de
{
et}
) est laissé dans votretest.c
fichier.En main.c, remplacer
#include "test.c"
par#include "test.h"
.Un dernier point: avec vos programmes plus complexes, vous serez confronté à des situations lorsque les fichiers d'en-tête peuvent être inclus plusieurs fois. Pour éviter cela, en-tête de sources sont parfois entourés par des définitions de macro, comme:
You actually compile the source code of test.c twice: •The first time when compiling test.c itself, •The second time when compiling main.c which includes all the test.c source.
et il est accepté qu'une réponse?? (techniquement vrai, mais n'a guère de réponses) Vous complie chaque unité une fois. Le compilateur résout ce qu'il peut dans le fichier actuel, puis les feuilles de crochets pour l'éditeur de liens. C'est le linker qui permettra de résoudre votre appel àtest();
- et d'avoir un problème de la détermination de ce quitest()
vous réellement direLe trait de soulignement est ajouté par le compilateur et utilisés par l'éditeur de liens. Le chemin de base est:
Ainsi, votre programme principal doit inclure le fichier d'en-tête pour le module de test qui devrait se composer uniquement de déclarations, comme le prototype de fonction:
Cela permet au compilateur de savoir qu'il existe quand principal.c est compilé, mais le code est en test.c, puis testez-les.o.
C'est le lien entre la phase qui unit les deux modules.
Par y compris les tests.c dans main.c, vous êtes à la définition de la fonction test() dans le main.o. Sans doute, vous êtes alors en liaison principale.o et de test.o, qui contiennent la fonction test().
Vous ne devriez pas inclure d'autres fichiers sources (*.c) dans .c fichiers. Je pense que vous voulez avoir un en-tête (.h) le fichier avec la DÉCLARATION de la fonction de test, et de la DÉFINITION dans un document distinct .c fichier.
L'erreur est causé par de multiples définitions de la fonction test (un test.c et l'autre en main.c)
J'ai eu le même problème et je l'ai résolu de la manière suivante.
Résoudre comme suit:
Prototype de fonction déclarations et variable globale doit être en test.h fichier et vous ne pouvez pas initialiser une variable globale dans le fichier d'en-tête.
Définition de la fonction et de l'utilisation de variable globale dans l'essai.c fichier
si vous initialiser les variables globales dans l'en-tête de il aura d'erreur suivant
Seulement de déclarations de variables globales dans l'en-Tête de fichier d'initialisation devrait fonctionner.
Espère que cela aide
Acclamations
Y compris le fichier d'implémentation (
test.c
) provoque afin d'être ajouté à votre main.c et respecté là-bas et puis de nouveau séparément. Donc, la fonctiontest
a deux définitions-l'un dans le code de l'objet demain.c
et une fois dans celle detest.c
, qui vous donne une ODR de violation. Vous devez créer un fichier d'en-tête contenant la déclaration detest
et de l'inclure dansmain.c
:Si vous avez ajouté de test.c dans votre Code::Blocks projet, la définition sera vu deux fois - une fois via le #include et une fois par l'éditeur de liens. Vous avez besoin de:
void test();
inclure le fichier de test.h dans le main.c
Si vous êtes à l'aide de Visual Studio, vous pouvez également faire de "#pragma once" en haut de la headerfile pour obtenir la même chose que le "#ifndef ..."-emballage. Certains autres compilateurs probablement le soutenir en tant que bien ..
.. Cependant, ne le faites pas 😀 Coller avec le #ifndef d'habillage pour atteindre cross-compilateur de compatibilité. Je voulais juste vous laisser savoir que vous pouvez également faire de #pragma une fois, puisque vous aurez probablement répondre à cette déclaration tout à fait un peu lors de la lecture d'autres peuples code.
Bonne chance avec