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