首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >链接错误:静态变量的多个定义

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

Stack Overflow用户
提问于 2018-04-03 14:59:39
回答 1查看 3.3K关注 0票数 3

因此,我首先编写了以下代码,并得到了一个编译错误。在阅读了这个答案之后:static array class variable "multiple definition" C++修改了我的代码,并将静态变量定义移动到cpp文件中,它执行得很好,但是我无法理解,当我使用了预处理器保护时,为什么它会显示多个定义错误?

代码语言:javascript
复制
#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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-03 12:04:28

因此,这是一个常见的错误,误解了标题后卫的工作方式。

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

例如,apple.cpp包括apple.h和grattes.h,而apple.h又包括grattes.h。然后,头保护将防止在编译过程中再次包含该文件gragges.h。

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

解决这个问题的唯一方法是将静态变量的定义移到cpp文件中。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49633230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档