链接错误:静态变量的多重定义

时间:2018-04-03 14:59:39

标签: 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

1 个答案:

答案 0 :(得分:1)

因此,这是误解标题保护程序工作方式的常见错误。

标题保护器可为一个编译单元保存多个声明,但不会在链接期间出错。一个编译单元意味着一个cpp文件。

例如apple.cpp包括apple.h和grapes.h,而apple.h则又包括grapes.h。然后,头文件后卫将防止在编译期间再次包含文件grapes.h。

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

解决此问题的唯一方法是将静态变量的定义移至cpp文件。