6 votes

Définition multiple de "..." c

J'ai un fichier d'en-tête "USpecs.h" :

#ifndef USPECS_H
#define USPECS_H
#include "Specs.h"

#include <iostream>
#include <vector>

std::vector<Specs*> UcakSpecs;

#endif

J'utilise cet en-tête à la fois dans la fonction principale et dans une autre classe appelée Ucak.

Mais lorsque je le construis, l'erreur suivante se produit :

Ucak.cpp|6|multiples définitions de `UcakSpecs'|.

Comme je l'ai cherché auparavant, cela devrait être correct avec #ifndef mais ce n'est pas le cas.

8voto

Mike Seymour Points 130519

Les gardes d'inclusion empêchent uniquement les définitions multiples au sein d'une seule unité de traduction (c'est-à-dire un seul fichier source avec ses en-têtes inclus). Elles n'empêchent pas les définitions multiples lorsque vous incluez l'en-tête de plusieurs fichiers source.

Au lieu de cela, vous devez avoir une déclaration dans l'en-tête :

extern std::vector<Specs*> UcakSpecs;

et une définition dans un (et un seul) fichier source :

std::vector<Specs*> UcakSpecs;

4voto

Joseph Mansfield Points 59346

Les gardes d'inclusion empêchent seulement l'en-tête d'être inclus dans la même unité de traduction plus d'une fois. Si vous incluez cet en-tête dans plusieurs unités de traduction, vous aurez plusieurs définitions de UcakSpecs dans l'ensemble du programme.

La manière de déclarer une variable globale est de la déclarer comme extern dans le fichier d'en-tête :

#ifndef USPECS_H
#define USPECS_H
#inclde "Specs.h"

#include <iostream>
#include <vector>

extern std::vector<Specs*> UcakSpecs;

#endif

Une variable globale déclarée comme extern n'est qu'une déclaration.

Assurez-vous ensuite qu'il n'est défini que dans une seule unité de traduction en le définissant dans un fichier d'implémentation (peut-être dans le fichier USpecs.cpp ) ;

std::vector<Specs*> UcakSpecs;

3voto

Rob I Points 2750

El #ifndef ne s'applique qu'à une seule unité de compilation. Puisque vous en avez deux (la fonction principale et Ucak ), la variable est définie deux fois.

Pensez à déclarer la variable comme extern dans le fichier d'en-tête :

extern std::vector<Specs*> UcakSpecs;

et en le définissant à l'intérieur du Ucak.cpp fichier :

std::vector<Specs*> UcakSpecs;

Cela devrait fonctionner.

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