【问题标题】:linking error : multiple definition of static variable链接错误:静态变量的多重定义
【发布时间】:2018-09-12 23:11:21
【问题描述】:

所以我先写了下面的代码,却遇到了编译错误。阅读此答案后: 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

【问题讨论】:

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


    【解决方案1】:

    所以,这是一个常见的错误理解标头守卫如何工作的错误。

    标头守卫为一个编译单元保存多个声明,但不保存链接期间的错误。一个编译单元意味着一个 cpp 文件。

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-03-06
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      • 1970-01-01
      相关资源
      最近更新 更多