erreur: attendu '=', ',', ';', 'asm" ou " __attribute__' before '*' token en C
J'ai les déclarations suivantes
FILE *fptr;
FILE *optr;
en algo.h
J'ai la main dans la main.c qui ouvre ces fichiers.
J'obtiens l'erreur ci-dessus si j'ai mis les déclarations dans le fichier d'en-tête. Si je l'ai mis dans la main.c, puis-je obtenir plusieurs erreurs de définition comme
src\main.o:main.c:(.bss+0xc88): multiple definition of rcount'
condi'
src\new_algo.o:new_algo.c:(.bss+0xc88): first defined here
src\main.o:main.c:(.bss+0xc8c): multiple definition of
src\new_algo.o:new_algo.c:(.bss+0xc8c): d'abord défini ici
- Avez-vous d'inclure stdio.h ?
- Oui, dans la principale.c et new_algo.c
- et avez-vous d'inclure stdio.h avant de l'après, y compris algo.h ?
Vous devez vous connecter pour publier un commentaire.
Sons un peu comme vous (1) n'ont pas inclus
<stdio.h>
où vous êtes à l'aide deFILE
, et/ou (2) avoir une certaine non-static
code exécutable ou nonextern
des définitions de variables dans vos en-têtes (et/ou sont#include
ing un fichier C).La première cause généralement des
FILE
de ne pas être définis (ou àtypedef
'd à un type qui n'existe pas, dans certains cas). La deuxième serait la cause de trucs à être défini dans chaque unité de traduction qui comprend le fichier, ce qui nuirait à l'éditeur de liens.À résoudre: (1)
#include <stdio.h>
dans le fichier oùFILE
est utilisé, et (2) déplacer les définitions communes des en-têtes dans un .c fichier (et/ou de les déclarer commestatic
ouextern
selon le cas), et ce n'est que#include
.h fichiers.void example() { }
dans un fichier inclus, chaque .fichier c qui comprend qu'il voit (compiler) sa propre copie deexample
. (Il pourrait l'inclure ici, mais pour la commodité du raisonnement supposer qu'il ne sera pas.) Quand vient le moment de la liaison, l'éditeur de liens doit voir unexample
, ou il ne sait pas lequel utiliser.static
rend la définition essentiellement privée à l'unité de traduction, de manière que chacun puisse avoir sa propre copie sans l'éditeur de liens se plaindre. Comme pour les variables globales, chacun doit être définie dans exactement une unité de traduction ainsi -- autres unités de traduction devrait l'avoir déclaré queextern
.#include
d le long de la voie, moins quelle que soit la chose#ifdef
'd out. Il pense que le code de ce fichier après le préprocesseur est fait sa chose.foo
défini, il voit tout un tas de choses étiquetésfoo
, il ne savent pas qu'ils sont des références à la même chose, ou (dans le cas de C) même quel type ils sont. Et il ne va pas aller vérifier octets pour voir si ils sont "la même chose", car il ne peut pas le faire de manière fiable. Si elle s'appuie sur le programmeur et le compilateur de dire "voici mon truc, et ça rapporte".rcount
etcondi
sont?Ce que vous avez en algo.h est un définition pas une déclaration. Si vous avez FICHIER *fptr; FILE *optr; à la fois la source et le fichier d'en-tête, puis de déclarer les variables à deux reprises.
Vous avez besoin:
algo.h
algo.c
Des sons que vous n'avez pas compris stdio. Ajouter
dans votre fichier d'en-tête au-dessus de ces déclarations.
Les erreurs de l'éditeur de liens n'ont rien à voir avec la
FILE
variables que vous avez posté.Il y a deux variables de votre source de, nommée
rcount
etcondi
, que, selon l'éditeur de liens est défini à la fois dans les fichiers source. La raison en est, je suppose, que vous définissez les variables dans un fichier d'en-tête est inclus dans les fichiers source. Certains vieux compilateurs encore ne peut pas gérer.