linking error : multiple definition of static variable
linking error : multiple definition of static variable
所以我先写了下面的代码,却遇到了编译错误。阅读此答案后:
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
所以,这是误解 header 警卫工作方式的常见错误。
Header 守卫为一个编译单元保存多个声明,但不会因 linking 期间的错误而发生。一个编译单元意味着一个 cpp 文件。
例如apple.cpp 包含 apple.h 和 grapes.h,apple.h 又包含 grapes.h。然后 header 守卫将阻止在编译期间再次包含文件 grapes.h。
但是当编译过程结束时,linker 正在执行将文件link合并在一起的工作,那么在这种情况下,它会看到同一个静态文件的两个内存位置变量,因为 header 文件包含在一个单独的翻译单元中,比如 apple2.cpp 它试图 link,从而导致多重定义错误。
解决它的唯一方法是将静态变量的定义移动到 cpp 文件中。
所以我先写了下面的代码,却遇到了编译错误。阅读此答案后: 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
所以,这是误解 header 警卫工作方式的常见错误。
Header 守卫为一个编译单元保存多个声明,但不会因 linking 期间的错误而发生。一个编译单元意味着一个 cpp 文件。
例如apple.cpp 包含 apple.h 和 grapes.h,apple.h 又包含 grapes.h。然后 header 守卫将阻止在编译期间再次包含文件 grapes.h。
但是当编译过程结束时,linker 正在执行将文件link合并在一起的工作,那么在这种情况下,它会看到同一个静态文件的两个内存位置变量,因为 header 文件包含在一个单独的翻译单元中,比如 apple2.cpp 它试图 link,从而导致多重定义错误。
解决它的唯一方法是将静态变量的定义移动到 cpp 文件中。