4 votes

Déclarer un global dans un fichier d'en-tête global ?

J'ai un fichier d'en-tête, disons Common.h, qui est inclus dans tous les fichiers de plusieurs projets. En gros, je veux déclarer une variable globale, par exemple :

class MemoryManager;
DLL_EXPORT MemoryManager* gMemoryManager;

Quand je fais cela, j'obtiens des tonnes d'erreurs d'édition de liens disant

La classe MemoryManager* gMemoryManager est déjà définie.

( ?

10voto

En l'état actuel des choses, vous créez une copie distincte de la variable dans chaque fichier compilé. Ces fichiers entrent ensuite en collision lors de l'étape de liaison. Rappelez-vous que le préprocesseur lit tous les fichiers d'en-tête et en fait un gros fichier. Ainsi, à chaque fois que ce gros fichier est compilé, une autre copie identique de la variable gMemoryManager est créé.

Vous devez utiliser extern et le définir dans un fichier non en-tête.

Dans votre fichier d'en-tête

extern DLL_EXPORT MemoryManager* gMemoryManager;

Dans l'un de vos fichiers C++

DLL_EXPORT MemoryManager * gMemoryManager;

Au fait, je n'ai aucune idée de ce que fait DLL_EXPORT, je suppose simplement qu'il doit être placé aux deux endroits.

2voto

sbi Points 100828

Ce site

MemoryManager* gMemoryManager;

définit une variable. Si vous faites cela dans un en-tête, la variable sera définie dans chaque unité de traduction qui inclut cet en-tête, d'où les erreurs de liaison. Si vous voulez déclarer une variable, faites-le de cette façon :

extern DLL_EXPORT MemoryManager* gMemoryManager;

et mettre la définition dans exactement un fichier cpp.

0voto

kami Points 1350

Lorsque vous souhaitez partager une variable globale entre plusieurs fichiers source en C++, vous devez les déclarer dans un seul fichier d'en-tête (.h) sous la forme suivante

extern  typeName variableName;

Et aussi, seul le fichier source correspondant (.cpp) doit contenir la définition

typeName variableName;

En externe Le mot clé est nécessaire pour distinguer la déclaration de la définition.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X