因此,我首先编写了以下代码,并得到了一个编译错误。在阅读了这个答案之后: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发布于 2019-04-03 12:04:28
因此,这是一个常见的错误,误解了标题后卫的工作方式。
头保护保存一个编译单元的多个声明,但不保存链接期间的错误。一个编译单元意味着一个cpp文件。
例如,apple.cpp包括apple.h和grattes.h,而apple.h又包括grattes.h。然后,头保护将防止在编译过程中再次包含该文件gragges.h。
但是,当编译过程结束时,链接器正在完成将文件链接到一起的工作,在这种情况下,它会看到相同静态变量的两个内存位置,因为头文件包含在一个单独的翻译单元中,比如apple2.cpp,它试图链接到它,从而导致多个定义错误。
解决这个问题的唯一方法是将静态变量的定义移到cpp文件中。
https://stackoverflow.com/questions/49633230
复制相似问题