zoukankan      html  css  js  c++  java
  • 链接错误:multiple definition of 'xxx' 问题解决及其原理

    内容借鉴 于CSDN炸鸡叔

    错因 截图:

    “multiple definition of  'head' ”  “multiple definition of  'tail' ”

    解决过程:

    1.首先要  区别  变量的定义 和 声明

    声明是向 编译器介绍名字---标识符,它告诉编译器“这个函数或变量 在哪儿可找到,模样”;

    而定义是说: “在这里建立变量或函数”,即为变量或函数 分配存储空间。

    对于变量,编译器确定变量的大小,然后在内存中开辟空间来保存其数据。

    对于函数,编译器会生成代码,这些代码最终也要占用一定的内存。

    总之,建立空间的声明即为“定义”, 不需要建立存储空间的即为“说明”

    -------------------------------------------------------------------------------------------

    2.一般在.h文件中定义个变零声明时,再在其他文件中只要包含这个.h文件, 编译时就会独立被编译器解释,

    然后每个.c文件就会生成独立的标识符和符号表,所以上诉代码在单独编译时并不会报错,语法是合法的。

    但是,最后在编译器链接的时候,就会将工程中所有的符号整合在一起,由于文件中有重复的变量。

    于是就会出现重复定义的错误,系统就会提示:multiple definition of 'xxxx'

      进一步解释,在编译每一个.c文件时,相当于一条有管道包围的纵向水流,二者间不干扰,

    当链接时两条原本独立的水管就变为横向流了,所以就出现了重复元素。所以当进行链接时就会出现重复定义的标识符。重复定义的标识符在这里只是变量,而函数不会。因为函数确实只在.c中定义了一次,多次声明是没问题的,而变量确实出现了两次定义。

    两次重复的变量定义链接器就不知道该用哪个地址作为变量的内存,所以报错

    -------------------------------------------------------------------------------------------------------

    3.其实只需要将全局变量从.h文件中移到.c文件中,然后在.h文件中用extern做外部声明

    注意在.h文件中不要对变量初始化赋值了

    简单说,有两个.c文件和一个.h文件,只要在一个.c文件定义全局变量(int a),再在.h中extern做外部声明就可(extern int a)。

  • 相关阅读:
    C#基础第五天-作业-用DataTable制作名片集
    C#基础第四天-作业答案-Hashtable-list<KeyValuePair>泛型实现名片
    C#基础第四天-作业-Hashtable-list<KeyValuePair>泛型实现名片
    C#基础第三天-作业答案-集合-冒泡排序-模拟名片
    C#基础第三天-作业-集合-冒泡排序-模拟名片
    C#基础第二天-作业答案-九九乘法表-打印星星
    C#基础第二天-作业-九九乘法表-打印星星
    C#基础第一天-作业答案
    C#基础第一天-作业
    C#-string.Format对C#字符串格式化
  • 原文地址:https://www.cnblogs.com/Martin-CH/p/10508177.html
Copyright © 2011-2022 走看看