c++11 - 链接错误 : multiple definition of static variable

标签 c++11 linker-errors static-variables

所以我先写了下面的代码,却遇到了编译错误。阅读此答案后:
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又包含grapes.h。然后头文件保护将阻止在编译期间再次包含文件葡萄.h。

但是当编译过程结束时,链接器正在执行将文件链接在一起的工作,那么在这种情况下,它会看到相同静态变量的两个内存位置,因为头文件包含在单独的翻译单元中,例如它试图链接到的 apple2.cpp,从而导致多重定义错误。

解决它的唯一方法是将静态变量的定义移动到 cpp 文件中。

关于c++11 - 链接错误 : multiple definition of static variable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49633230/

相关文章:

C++ 链接器错误 : undefined references only on optimized build

java - 静态变量和 block 之间的执行顺序是如何执行的?

c++ - 尝试根据另一个 vector 对一个 vector 进行排序时出现不一致

c++ - 为什么我在使用 std::locale::locale(const std::string&) 时出错?

c++ - 无法定位错误cpp linux

Python 静态变量

c# - C#中静态变量有什么用?什么时候使用它?为什么我不能在方法内部声明静态变量?

c++ - 优化 C++11 随机生成器的使用

c++ - 什么时候可以在函数及其参数之间插入未排序的代码?

c++ - 重载在基类非虚函数中使用的虚函数