À l'aide struct dans différents .fichier cpp
J'en ai deux .rpc fichiers dans un seul projet, main.cpp et myfile.cpp
J'ai globalement défini struct mystruct dans main.cpp maintenant je veux profiter de cette structure dans myfile.cpp.
Quand j'écris mystruct dans un fichier d'en-tête et de les inclure dans les deux fichiers cpp j'obtiens une erreur, en disant mystruct redéfinition. Comment dois-je résoudre ce problème.
vous devez ajouter un peu de code pour avoir des réponses précises à vos questions.
OriginalL'auteur paras | 2011-07-30
Vous devez vous connecter pour publier un commentaire.
Si vous essayez de partager la définition d'une struct entre plusieurs unités de compilation (fichiers cpp), la façon la plus courante est: Place de la définition de votre structure dans un fichier d'en-tête (mystruct.h). Si la structure contient toutes les méthodes (c'est à dire qu'il est plutôt une classe avec tous les membres du public par défaut), vous pouvez les mettre en œuvre dans mystruct.CPP fichier, ou, s'ils sont légers, directement au sein de la structure (ce qui les rend inline par défaut).
mystruct.h:
mystruct.cpp
Vous pouvez utiliser votre structure dans autant de fichiers cpp que vous le souhaitez, il suffit de
#include
mystruct.h:main.cpp
Si, d'autre part, vous essayez de partager un mondial instance de la structure à l'échelle de plusieurs unités de compilation (il n'est pas absolument clair à partir de votre question), faire comme ci-dessus mais aussi ajouter
à mystruct.h. Cela permettra d'annoncer qu'une instance est disponible avec une liaison externe; en d'autres termes qu'une variable existe mais est initialisé ailleurs (dans votre cas mystruct.cpp). Ajouter l'initialisation de l'instance globale de mystruct.cpp:
MyStruct globalStruct;
C'est important. Sans créer manuellement une instance de
globalStruct
, vous obtiendrez en suspens-externe erreurs d'édition de liens. Vous avez maintenant accès àglobalStruct
de chaque unité de compilation qui comprend mystruct.h.OriginalL'auteur Martin Gunia
Le problème, c'est que vous avez quasiment le même code deux fois si vous voyez le comprennent comme une importation du code.
Vous pouvez utiliser #ifdef pour la fixer, voir http://www.fredosaurus.com/notes-cpp/preprocessor/ifdef.html
OriginalL'auteur Daniel Wehner
Vous devez déplacer la commune de la structure d'un fichier d'en-tête et de l'inclure l'en-tête dans les deux fichiers. Toute autre solution est une solution de contournement.
OriginalL'auteur cprogrammer
Déclaration et les définitions sont deux choses différentes. Pour votre cas, vous êtes allocation d'espace pour votre structure main.cpp. Dans votre en-tête, vous devez utiliser la extern modificateur de votre structure, de sorte que tous les fichiers à inclure le fichier d'en-tête aura l'air dans l'espace de noms global de la structure. Espérons que cela aide.
OriginalL'auteur Vern
L'en-tête est l'endroit où vous déclarez que votre
struct
sera composé de (probablement uncommon.h
fichier inclus parmain.cpp
etmyfile.cpp
):Dans votre
main.cpp
, c'est là que vous utilisez réellement la structure:Ne pas mettre la définition de votre
struct
dans votremain.h
etmain.cpp
- ou vous obtiendrez une redéfinition erreur!Aussi, de ne pas inclure le fichier cpp - inclure le fichier d'en-tête (par exemple,
common.h
). Sans en savoir plus sur la structure de votre programme, il est difficile de fournir de meilleures informations.OriginalL'auteur
Vous devez définir la structure dans le fichier d'en-tête seulement, vous devez supprimer la définition de
main.cpp
J'ai compris Op question exactement de cette façon. Attention à la redéfinition de couplage d'erreur mentionné dans la question.
Il est en train de redéfinir MyStruct deux fois.. extern ne sera pas corrigé. Extern moyens de liaison externe. Le compilateur fera confiance au programmeur plus tard que l'objet sera situé par l'éditeur de liens. Autrement, il va jeter une erreur de l'éditeur de liens. Il n'a pas une erreur de l'éditeur de liens. Vous devez apprendre comment extern œuvres.
Je sais comment il fonctionne, j'ai juste compris la question, à tort, ok, il y a redéfinition de la structure, pas variable. Si vous regardez mon code, vous verrez que je ne suis pas en train d'appliquer
extern
à une structure de définition.Non, vous avez été l'application externe d'une struct déclaration. De toute façon, c'était mal.
OriginalL'auteur unkulunkulu
Peut-être vous pouvez donner plus d'informations à propos de qu'est-ce que la mise en page de votre projet.
En passant par le deviner, probablement votre problème peut être l'un des deux:
vous voulez avant la déclaration de la structure.
l'aide d'inclure des gardes pour empêcher la redéfinition.
Voir le lien suivant pour savoir comment gérer à la fois:
http://www.adp-gmbh.ch/cpp/forward_decl.html
Les fichiers d'en-tête utilisons également inclure des gardes, de sorte que vous pouvez comprendre ce qu'est exactement peut résoudre votre problème.
OriginalL'auteur A. K.
Si vous voulez partager toute variable entre plusieurs fichiers cpp, vous devez les déclarer dans le header comme
extern
. Et sansextern
dans un de fichiers c++.Si vous ne le faites pas, il manque à la liaison, parce que de multiples objets auraient variable avec le même nom. Au lieu de cela lors de l'utilisation de
extern
un objet aurait cette variable et d'autres objets de lien.OriginalL'auteur kravemir
Le standard C/C++ approche:
OriginalL'auteur Ajay