2010-08-24 6 views
4

D'accord, étrange question de temps!Tableau global dans l'en-tête C?

Je suis refactorisation un vieux code C++ qui déclare un tas de tableaux comme ceci:

static SomeStruct SomeStructArray[] = { 
    {1, 2, 3}, 
    {4, 5, 6}, 
    {NULL, 0, 0} 
} 

Et ainsi de suite. Ceux-ci sont dispersés dans les fichiers sources et sont utilisés là où ils sont déclarés.

Cependant, je voudrais les déplacer dans un fichier source unique (principalement parce que je suis venu avec un moyen de les générer automatiquement). Et, bien sûr, j'essaie naïvement de faire un en-tête pour eux:

static SomeStruct SomeStructArray[]; 

En fait, même si je sais que cela est faux, mais voici l'erreur du compilateur quand même:

error C2133: 'SomeStructArray' : unknown size arrays.h 
error C2086: 'SomeStruct SomeStructArray[]' : redefinition arrays.cpp 

Donc, je suppose, ce qui est la bonne façon de le faire?

Répondre

8

Si vous allez mettre les tableaux eux-mêmes tous dans un seul fichier (et d'y accéder apparemment d'autres fichiers), vous devez retirer le static des définitions (ce qui les rend visibles seulement à l'intérieur de la même unité de traduction (c'est-à-dire, fichier)). Puis, dans votre en-tête, vous devez ajouter un extern à chaque déclaration. Enfin, bien sûr, vous devrez vous assurer que lorsque vous avez un tableau de SomeStruct (par exemple), la définition de SomeStruct est visible avant de tenter de définir un tableau.

+0

Ahhh. Ça a du sens. En outre, oui, j'ai omis les parties non pertinentes du code, car elles ne sont pas pertinentes :) –

+0

C'est tellement soigné !!!!! –

0

Essayez d'utiliser

.h:

extern SomeStruct SomeStructArray[]; 

fichier .cpp:

extern SomeStruct SomeStructArray[] = { 
    {1, 2, 3}, 
    {4, 5, 6}, 
    {NULL, 0, 0} 
} 
+2

Pourquoi 'extern' sur le tableau lui-même? N'a-t-il pas 'extern''d de la déclaration? –

0

Créer un fichier d'en-tête et mettre cela en elle:

extern SomeStruct SomeStructArray[]; 

puis placez votre code existant dans un fichier source (Pas un fichier d'en-tête):

SomeStruct SomeStructArray[] = { 
    {1, 2, 3}, 
    {4, 5, 6}, 
    {NULL, 0, 0} 
} 

Et la baisse, vous ne pouvez pas obtenir la taille du tableau dans d'autres fichiers source:

size_t size = sizeof SomeStructArray; // doesn't work in any source file apart 
             // from the one defining the array. 

Vous pouvez ajouter des variables supplémentaires pour contourner cela.

Cela a été testé en utilisant DevStudio2k5.

+0

Ce n'est pas vrai, mon compilateur (même en mode de conformité standard) dit: * erreur: 'SomeStructArray' a été déclaré 'extern' et plus tard 'static' * – schot

+0

Ah, je vois ce que j'ai fait. Je n'ai pas inclus l'en-tête déclarant le tableau dans le fichier source contenant la définition du tableau. Je l'ai réparé. – Skizz