Délaration externe pour un tableau?

J’ai un tableau défini dans un fichier et dans un autre je dois l’utiliser, par exemple-

/* ac - defines an array */ int a[] = {1,2,3,4,5,6,7,8,9}; /* bc - declare and use it. */ #define COUNT ((sizeof a)/(sizeof int)) extern int a[]; //size of array . . . int i; for(i=0; i<COUNT; i++) printf("%d", a[i]); . . . 

Maintenant, lorsque j’essaye de le comstackr, cela me donne une erreur en disant que sizeof ne peut pas être utilisé avec des types incomplets.

Quelqu’un peut-il me dire comment gérer de tels cas en C / C ++? Je ne veux pas de tableau indice en ac

Merci d’avance

Vous pouvez mettre quelque chose comme ce qui suit dans ac puis l’externaliser de bc .

En ca:

 int a[] = {1, 2, 3}; const int lengthofa = sizeof( a ) / sizeof( a[0] ); 

Et puis en Colombie-Britannique:

 extern int a[]; // the extern (thanks Tim Post) declaration means the actual storage is in another // module and fixed up at link time. The const (thanks Jens Gustedt) prevents it // from being modified at runtime (and thus rendering it incorrect). extern const int lengthofa; void somefunc() { int i; for ( i = 0; i < lengthofa; i++ ) printf( "%d\n", a[i] ); } 

Si vous souhaitez que la taille de votre tableau soit accessible en tant que constante de compilation, vous n’avez pas d’autre choix que de spécifier explicitement la taille du tableau dans la déclaration extern du tableau.

 extern int a[9]; 

Dans ce cas, il vous incombe de vous assurer que la taille du tableau est cohérente entre la déclaration extern et la définition. Vous pouvez utiliser une constante manifeste pour cela, mais il vous appartiendra néanmoins de vous assurer que le nombre d’initialiseurs compris entre {} et la taille déclarée est identique.

Si vous ne vous souciez pas d’avoir la taille du tableau comme constante de compilation, vous pouvez alors faire ce que Mark Wilkins suggère dans sa réponse.

Je voudrais #define ARRAY_MAX (or whatever) dans un en-tête externe généralement utilisé pour définir de telles choses, puis inclure cet en-tête dans les deux fichiers qui en ont besoin. Cela fonctionne bien lorsque vous avez tendance à conserver la plupart sinon la totalité de vos define dans un ou deux en-têtes centraux.

Lors de la compilation bc, le compilateur ne dispose pas d’assez d’informations pour déterminer la taille du tableau. Cette information est seulement en ac où votre liste d’initialisation est dans la scope.

Vous devrez communiquer la taille en quelque sorte. Une méthode consiste à définir une constante int avec la taille et externe également. Une autre possibilité serait d’utiliser une sentinelle (une valeur en dehors de votre plage de données valide) pour indiquer la fin du tableau.

À mon avis, si vous n’avez pas de définition et que vous définissez avec sizeof un fichier unique, il ne comstack pas.

Les fichiers sont compilés et stockés sous forme de fichiers * .obj / * .a. Vous pouvez utiliser des tableaux à partir d’autres fichiers grâce à la déclaration extern qui sera vérifiée dans le processus de liaison, après la compilation.

Vous voulez déclarer define (le préprocesseur doit vous aider ici. Il est exécuté avant le compilateur).

donc avant la compilation, vous n’obtiendrez pas de tableau à partir d’un autre fichier …