声明:突然看到这篇文章,发现了c语言中使用全局变量的错误,特转之。

首先看一段代码(https://gist.github.com/3760736)

func.c

int

buf

=

0

;

void

func

()

{

buf

=

2

;

/* Do something else */

}

view raw func.c This Gist brought to you by  GitHub.

main.c

#include

int

buf

;

void

func

();

int

main

()

{

buf

=

1

;

func

();

printf

(

"%d

\n

"

,

buf

);

return

0

;

}

view raw main.c This Gist brought to you by  GitHub.

编译两个文件,输出的结果是怎样的呢?一眼看上去,可能会输出1,因为两个全局变量buf在不同文件中,又没有extern声明,显然是两个嘛。然而实际上它的运行结果却是2,这说明了这两个文件中引用到的其实是一个变量!

这是为什么呢?原因是在编译时,C语言编译器将全局符号标记为strong和weak两类:

函数和初始化的全局符号被标记为strong

未初始化的全局符号被标记为weak

连接时,连接器对多重定义的全局符号的解析原则如下:

同一个符号不允许有多个strong定义;

假如一个符号有一个strong定义和多个weak定义,那么采用该符号的strong定义;

假如一个符号有多个weak定义,那么选取任意一个weak定义

由于两个变量一个初始化了,一个没有初始化,所以一个是strong,一个是weak,所以连接器在符号解析时会把他们当成一个。

如果我们把main.c中的buf也初始化了:

#include

int

buf

=

0

;

void

func

();

int

main

()

{

buf

=

1

;

func

();

printf

(

"%d

\n

"

,

buf

);

return

0

;

}

view raw func.c This Gist brought to you by  GitHub.

再次编译就会发现

duplicate symbol _buf in:

/var/folders/44/_cc501qx1jd1p5bfrjbk6b100000gn/T//ccZ87C6g.o

/var/folders/44/_cc501qx1jd1p5bfrjbk6b100000gn/T//ccZlES8n.o

ld: 1 duplicate symbol for architecture x86_64

collect2: ld returned 1 exit status

这是因为两个全局变量都是strong的。

c语言中跨文件变量,C语言中跨文件的全局变量相关推荐

  1. C语言 const 修饰变量 - C语言零基础入门教程

    目录 一.const 简介 二.const 实战 1.使用 const 修饰变量必须初始化 2.使用 const 修饰变量不初始化 3.修改 const 修饰变量的值 三.重点提示 四.猜你喜欢 零基 ...

  2. 为什么c语言要定义变量,C语言为什么要规定对所用到的变量要“先定义,后使用”...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 int a=10; 以上一句话对变量a进行了声明,定义以及初始化 extern int a; 以上一句话仅仅对变量a进行了声明,将a的链接属性设置为ext ...

  3. 字母c语言定义为什么变量,C语言为什么要规定对所用到的变量要“先定义,后使用”...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 int a=10; 以上一句话对变量a进行了声明,定义以及初始化 extern int a; 以上一句话仅仅对变量a进行了声明,将a的链接属性设置为ext ...

  4. c 语言boll型变量,My语言几种常见指标编写与跨指标模型的案例分析

    发明者量化平台的My语言是一种函数高度集成且功能强大的量化编程语言,专为量化初学者量身定做,虽然它受众多初学者的欢迎,在功能上却一点不比别的编程语言逊色.在深度定制某些复杂策略方面,由于已经定制好的函 ...

  5. r语言 回归分析 分类变量_R语言 | 回归分析(二)

    R语言 语言学与R语言的碰撞 Xu & Yang PhoneticSan 学习参考 Discovering Statistics Using R Statistics for Linguist ...

  6. r语言 回归分析 分类变量_R语言进阶之广义线性回归

    广义线性回归是一类常用的统计模型,在各个领域都有着广泛的应用.今天我会以逻辑回归和泊松回归为例,讲解如何在R语言中建立广义线性模型. 在R语言中我们通常使用glm()函数来构建广义线性模型,glm实际 ...

  7. c语言减少控制流变量,C语言 第3章 控制流 (1简单程序设计).ppt

    第三章 控制流 鹿豺绽身实滁盗猩毡佃聘配那好嚏桩执滴镍辱蓄填撂淬把俞袖未塘居补出C语言 第3章 控制流 (1简单程序设计)C语言 第3章 控制流 (1简单程序设计) 2 主要内容 学习三种结构的程序设 ...

  8. c语言中整形变量,C语言基本数据类型:整型(int)用法详解

    1.整型int C语言提供了很多整数类型(整型),这些整型的区别在于它们的取值范围的大小,以及是否可以为负.int是整型之一,一般被称为整型.以后,在不产生歧义的情况下,我们把整数类型和int都称为整 ...

  9. c语言 平方 用变量,C语言编程之《变量—用来存储数据的小房子》

    上一节咱们了解到计算机是使用一个一个的小房子来记住数字.计算机有不少不一样种类的小房子.html int a; 表明向计算机申请一个小房子用来存放数值,小房子的名字叫作a.int和a之间有一个空格,a ...

最新文章

  1. 机器学习典型步骤以及训练集、验证集和测试集概念
  2. 去除win7桌面快捷方式小箭头
  3. 在html页面提交值到动态页面时出现中文值为乱码的解决方案
  4. sqlmap使用_sqlmap于sql labs下使用
  5. 内固定取出术后护理_“钢铁侠“们注意了——身体内的钢板或内固定需要取出吗?...
  6. sql调优的几种方式_「数据库调优」屡试不爽的面试连环combo
  7. 米范 - 为新媒体和电商从业者提供的酷导航
  8. 深度学习(目标检测。图像分割等)图像标注工具汇总
  9. 更新小红伞antivirus失败:生成更新结构失败。更新库生成错误 556
  10. Leetcode961. N-Repeated Element in Size 2N Array重复N次的元素
  11. python编辑快速上手_Python编程如何快速上手,答案在这里
  12. python中怎么判断字母大小写_python判断大小写字母
  13. 花朵藤条植物生长动画婚礼视频标题pr模板
  14. 卷积神经网络(CNN)网络结构及模型原理介绍
  15. 固态硬盘原理与ASS SSD Benchmark
  16. WRF官网案例运行01
  17. 什么是微量元素?微量元素对人体有什么作用呢?GK
  18. 数据库异常状态:Recovery Pending,Suspect,估计Recovery的剩余时间
  19. require(): open_basedir restriction in effect. File
  20. “智慧工地“有哪些高科技?一起来看看

热门文章

  1. Linux内核——进程管理与调度
  2. 最大输入hdu 2534 规律水题 求任意个a,b的和 不能表示的最大的数
  3. MIME文件类型格式--汇总
  4. 田志刚北京大学CIO(信息总监)班讲知识管理
  5. 本机发邮件测试mail函数
  6. 教你开发省电的 iOS app(WWDC17 观后)
  7. POSIX消息队列信号通知
  8. [实战虚拟化]无需借助虚机安装,就能从VHD原生启动
  9. golang struct 动态创建
  10. linux c uuid guid 生成