C++ “的多重定义……”&引用;C

C++ “的多重定义……”&引用;C,c++,header,C++,Header,我有一个头文件“USpecs.h”: \ifndef USPECS\u H #定义USPECS_H #包括“规格h” #包括 #包括 std::矢量UcakSpecs; #恩迪夫 我在main函数和另一个名为Ucak的类中都使用了这个头 但当我构建它时,会出现以下错误: Ucak.cpp | 6 | ` UCAKSpec'的多重定义| 正如我之前搜索过的,它应该可以使用#ifndef,但事实并非如此。包含保护只会防止标题多次包含在同一翻译单元中。如果将此标题包含在多个翻译单元中,则整个程序中将

我有一个头文件“USpecs.h”:

\ifndef USPECS\u H
#定义USPECS_H
#包括“规格h”
#包括
#包括
std::矢量UcakSpecs;
#恩迪夫
我在main函数和另一个名为Ucak的类中都使用了这个头

但当我构建它时,会出现以下错误:

Ucak.cpp | 6 | ` UCAKSpec'的多重定义|


正如我之前搜索过的,它应该可以使用#ifndef,但事实并非如此。

包含保护只会防止标题多次包含在同一翻译单元中。如果将此标题包含在多个翻译单元中,则整个程序中将有多个
ucakspec
的定义

声明全局变量的方法是在头文件中将其声明为
extern

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


#include <iostream>
#include <vector>

extern std::vector<Specs*> UcakSpecs;

#endif
extern std::vector<Specs*> UcakSpecs;
#ifndef
仅适用于单个编译单元。由于您有两个(主函数和
Ucak
类),因此变量定义了两次

考虑在头文件中将变量声明为
extern

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


#include <iostream>
#include <vector>

extern std::vector<Specs*> UcakSpecs;

#endif
extern std::vector<Specs*> UcakSpecs;

这应该是可行的。

包含保护仅在单个翻译单元(即包含标题的单个源文件)中防止多个定义。当包含来自多个源文件的标头时,它们不会阻止多个定义

相反,您应该在标题中有一个声明:

extern std::vector<Specs*> UcakSpecs;
extern std::vector UcakSpecs;
以及一个(且仅一个)源文件中的定义:

std::vector<Specs*> UcakSpecs;
std::向量UcakSpecs;

请显示CPP代码文件第一个“包含”上有一个输入错误。另外,如果这不是Specs.h(因为您包含了它),它是什么?
std::vector<Specs*> UcakSpecs;