所以我先写了下面的代码,然后收到编译错误。读完这个答案之后:static array class variable "multiple definition" C++我修改了我的代码并将静态变量定义移动到cpp文件并且执行正常,但我无法理解当我使用预处理器防护时,为什么它会显示多个定义错误?
#ifndef GRAPH_H
#define GRAPH_H
#include<iostream>
#include<vector>
using namespace std;
struct node{
int element=0;
static vector<bool> check;
node(){
if(check.size()<element+1)
check.resize(element+1);
}
};
vector<bool> node::check;
#endif
因此,这是误解标题保护工作方式的常见错误。
标题保护为一个编译单元保存多个声明,但不保存链接期间的错误。一个编译单元意味着一个cpp文件。
例如。 apple.cpp包括apple.h和grapes.h,而apple.h又包含grape.h。然后标题保护将阻止在编译期间再次包含文件grapes.h。
但是当编译过程结束,并且链接器正在完成将文件链接在一起的工作时,那么在这种情况下它会看到相同静态变量的两个内存位置,因为头文件包含在一个单独的翻译单元中,比如说apple2.cpp与其试图链接,从而导致多重定义错误。
解决它的唯一方法是将静态变量的定义移动到cpp文件。