C语言中跨文件的全局变量

2023-05-16

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

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

func.c

123456

         
         
int buf = 0 ;

         
         
 

         
         
void func () {

         
         
buf = 2 ;

         
         
/* Do something else */

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

main.c

1234567891011

         
         
#include <stdio.h>

         
         
 

         
         
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也初始化了:

1234567891011

         
         
#include <stdio.h>

         
         
 

         
         
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的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言中跨文件的全局变量 的相关文章

  • 一文带你快速理解FreeRTOS代码规范~

    导读 遇到些朋友感觉FreeRTOS内核代码看起来很不习惯 xff0c 不习惯其编码风格 xff0c 本文就来梳理一下其代码规范 xff0c 便于提高阅读其代码的效率 代码基于FreeRTOS V10 4 3 FreeRTOS代码结构 其内
  • [Adaptive Autosar]深入理解--Persistency

    目录 1 Per架构 2 Per初始化 3 Per错误处理 4 多进程访问 5 冗余存储 6 安装和更新per数据 7 Key Value 方式 8 file storage 方式 9 典型使用代码 Persistency模块对比 CP 中
  • 用Excel教会你PID算法!

    01 引入PID 电机控制 这样是没有反馈的 xff0c 也就是说我们完全相信输入的数字 xff0c 且是理想化的模型 xff0c 比如输入占空比为50 的25Kz的PWM xff0c 车轮速度为1m s xff0c 实际产品中会受到各种这
  • 带你快速理解FreeRTOS的代码规范~

    导读 遇到些朋友感觉FreeRTOS内核代码看起来很不习惯 xff0c 不习惯其编码风格 xff0c 本文就来梳理一下其代码规范 xff0c 便于提高阅读其代码的效率 代码基于FreeRTOS V10 4 3 FreeRTOS代码结构 其内
  • 单片机串口最底层的本质​!

    嵌入式开发中 xff0c UART串口是最常见的一种通信接口 xff0c 你知道为啥串口这么常见吗 xff1f 本文就带你深入了解串口最底层的本质内容 一 什么是串口通讯 xff1f 串行通讯是指仅用一根接收线和一根发送线就能将数据以位进行
  • 一个本科生学习嵌入式的心得~

    为毕业后能找到工作而读书 xff0c 本着务实精神 xff0c 从入学那一刻起就要开始准备找工作了 发这篇文章主要是针对大学刚接触嵌入式的同学 很多新手觉得嵌入式入门并不容易 xff0c 牵扯的内容 知识点太多 像C语言基础是否掌握 xff
  • 使用 Rust 进行嵌入式开发

    作者 xff1a RT Thread社区团队 liukang 原文链接 xff1a https club rt thread org ask article 2944 html Rust 是什么 Rust 是一门赋予每个人构建可靠且高效软件
  • STM32的SPI外设片选只有一个,怎么破?

    之前用STM32的SPI需要控制很多外部芯片 xff0c 可是一个SPI的外设只有一个片选 xff0c 要实现独立片选一主多从 xff0c 怎么实现呢 xff1f SPI总线拓扑 一般地 xff0c SPI总线按照下图方式进行连接 xff0
  • 编程规范 | 关于头文件的几条规范

    一般来说 xff0c 每一个 c或者 cpp文件对应一个头文件 h文件 xff0c 当然 xff0c 也有例外 xff0c 例如一些测试单元或者main文件 xff0c 头文件的一些规范可以令代码可读性 程序的性能等大为改观 xff0c 所
  • 10分钟教你在MDK中部署LVGL

    说在前面的话 说实话 xff0c LVGL这么有牌面的项目 xff0c 其维护者居然没听说过cmsis pack xff0c 这着实让我略为破防 xff1a 连lwIP都在Pack Installer里有个坑位 xff0c 难道这是个LVG
  • 国产高性能RISC-V通用MCU又来一个新成员!

    业界新锐MCU厂商先楫半导体宣布2022年5月正式推出 HPM6300系列 xff0c 这是继去年11月发布全球性能最强RISC V微控制器HPM6700 6400系列后 xff0c 再添一款新力量 集高性能 高实时 低功耗 高性价比于一身
  • 趟过这20个坑,才敢说自己是搞电的~

    电子工程师指从事各类电子设备和信息系统统研究 教学 产品设计 科技开发 生产和管理等工作的高级工程技术人才 一般分为硬件工程师和软件工程师 硬件工程师 xff1a 主要负责电路分析 设计 xff1b 并以电脑软件为工具进行PCB设计 xff
  • 【随笔篇】2019全国大学生电子设计竞赛回望与总结

    1 写在前面 2019全国大学生电子设计大赛已经落幕 xff0c 我和李同学各带一队斩获国一 短暂的休息后我们从国一的喜悦中恢复 xff0c 逐渐开始了新的征程 本来是希望能够通过电赛保研 xff0c 但无奈四非大学名额有限 xff0c 留
  • STM32的SPI外设片选只有一个怎么破?

    之前用STM32的SPI需要控制很多外部芯片 xff0c 可是一个SPI的外设只有一个片选 xff0c 要实现独立片选一主多从 xff0c 怎么实现呢 xff1f SPI总线拓扑 一般地 xff0c SPI总线按照下图方式进行连接 xff0
  • IT开发的岔路口:究竟是Java好还是嵌入式好?

    一份工作在一个人的生活中占据重要地位 xff0c 对于一个人的生活质量占据决定性作用 xff0c 可以说工作决定一个人一生 xff0c 对于选择工作当然是要选择新兴产业且有发展前途的行业 xff0c 那么在IT技术领域 xff0c 选择Ja
  • 做好一块PCB板不难,但做一块好PCB板却不容易!

    我们说做PCB板就是把设计好的原理图变成一块实实在在的PCB电路板 xff0c 请别小看这一过程 xff0c 有很多原理上行得通的东西在工程中却难以实现 xff0c 或是别人能实现的东西另一些人却实现不了 xff0c 因此说做好一块PCB板
  • 用python在树莓派上编程,你可以将项目扩展到令人难以置信的规模

    树莓派是一个非常廉价的 只有手掌大小的完全可编程的计算机 虽然树莓派的体积小 xff0c 但是它的潜力无限 你可以像使用常规台式计算机一样在树莓派上创建一个非常酷的工程 例如 xff0c 你可以用树莓派搭建你自己的家用云存储服务器 树莓派用
  • 很多人觉得FPGA难学,因为他们没总结出数电的尽头是模电!

    问 xff1a 本人零基础 xff0c 想学FPGA xff0c 求有经验的人说说 xff0c 我应该从哪入手 xff0c 应该看什么教程 xff0c 应该用什么学习板和开发板 xff0c 看什么书等 xff0c 希望有经验的好心人能够给我

随机推荐

  • 作为硬件工程师的基本技能,画PCB板有许多经验需要get!

    一 原理图常见错误 xff08 1 xff09 ERC报告管脚没有接入信号 xff1a a 创建封装时给管脚定义了I O属性 xff1b b 创建元件或放置元件时修改了不一致的grid属性 xff0c 管脚与线没有连上 xff1b c 创建
  • 如何判断CPU是否正在执行中断函数?

    1 这是一个有许多经验的攻城狮都遇到过的坑 xff0c 本文教你正确绕过这个坑 xff1b 2 教大家了解 get CONTROL的用法 xff0c 及xQueueSend和xQueueSendFromISR的区别 xff1b 问题来源 今
  • 一颗MCU可以搞定无人机的电机驱动+飞控算法!

    i MX RT跨界处理器具有实时操作和应用处理器级的功能 xff0c 其已经实际应用在智能交互 工厂自动化 智能支付终端 语音处理和语音识别等领域 xff0c 这些应用场景已经足以证明i MX RT的强大与广泛的适应性 除了前述的应用方向之
  • 重磅!美国最新14类技术出口管制来了,想买的基本都买不到了

    根据2018年国会通过的 出口管制改革法案 xff08 Export Control Reform Act xff09 要求 xff0c 美国商务部工业安全署 xff08 Department of Commerce Bureau of I
  • 从行业到技术,10+年资深工程师带你进行嵌入式行业职业规划!

    找一个好工作 xff0c 谈一份好薪水详细这也是大部分人的心愿 xff0c 那么嵌入式行业该如何规划呢 xff1f 下面我们从几方面来深入探讨 1 了解嵌入式行业 嵌入式系统的应用已经覆盖到我们的生产 工作和生活的各个方面 小到智能家电 x
  • mitmproxy下载安装配置

    具体介绍可以参考 xff1a Mitmproxy mitmdump中文文档以及配置教程 守护式等待 博客园 我记录下自己操作过程中的一些细节 目录 一 下载 二 PC证书生成及安装 三 安卓端证书安装 xff08 雷电模拟器 xff09 x
  • 5G,带给嵌入式产业的机会在哪里?

    从现在开始 我们将会目睹5G 的爆发式成长 5G最突出的优点在于低时延和点对点的快速高效通信 那么它会给嵌入式产业带来哪些机会呢 嵌入式工程师面对5G的到来 又需要做哪些方面的准备和改变呢 最近 单片机与嵌入式系统应用 邀请了业内专家 公司
  • 在ubuntu+vs code上通过HTTP协议实现服务器端和客户端通信

    一 操作系统 xff1a Ubuntu16 0 4 xff08 两台虚拟机 xff09 二 编译工具 xff1a vs code xff08 相关配置见之前的文章vs code安装与配置 xff0c 在搜索C 43 43 配件时 xff0c
  • 树莓派设置开机自启动任务导致无法进入系统

    环境 树莓派 32位 问题描述 使用 Hugo 搭建博客后 xff0c 每次启动树莓派都要手动执行在博客文件夹下执行 hugo server watch 命令 xff0c 想要使用开机自启动方式 按照网上方式 xff1a 将写好的脚本 sh
  • 功能齐全的串口调试工具——串口猎人

    1 xff0c 简介 官方介绍 xff1a 串口猎人 Serial Hunter 是一款强大实用的串口调试工具 xff0c 串口猎人调试工具能以十六进制显示信息 xff0c 可进行基本发码 xff0c 高级收码和发码 xff0c 显示波形及
  • 旷视张祥雨:高效轻量级深度模型的研究和实践 | AI ProCon 2019

    演讲嘉宾 张祥雨 xff08 旷视研究院主任研究员 基础模型组负责人 xff09 编辑 Just 出品 AI科技大本营 xff08 ID rgznai100 xff09 基础模型是现代视觉识别系统中一个至关重要的关注点 基础模型的优劣主要从
  • 深挖谷歌 DeepMind 和它背后的技术

    作者 James Murphy 译者 天道酬勤 责编 Carol 出品 AI科技大本营 xff08 ID rgznai100 xff09 人工智能 AI 的子集已经成倍增长 xff0c 并完成了只有人类才能完成的各种任务 像机器学习这样的技
  • 无限想象空间,用Python玩转3D人体姿态估计

    前言 姿态估计 xff0c 一直是近几年的研究热点 它就是根据画面 xff0c 捕捉人体的运动姿态 xff0c 比如 2D 姿态估计 xff1a 再比如 3D 姿态估计 xff1a 看着好玩 xff0c 那这玩应有啥用呢 xff1f 自动驾
  • 如何成为一名合格的算法工程师?我们做了一次技能拆分…

    文 张相於 成为一名合格的开发工程师不是一件简单的事情 xff0c 需要掌握从开发到调试到优化等一系列能力 xff0c 这些能力中的每一项掌握起来都需要足够的努力和经验 而要成为一名合格的机器学习算法工程师 xff08 以下简称算法工程师
  • 马上 2018 年了,该不该下定决心转型AI呢?

    本文授权转自知乎 如此火爆的AI xff0c 会不会像Android和iOS一样 xff0c 五年后归于平淡 xff1f 转型AI真的有必要吗 xff1f 2017年 xff0c AI就像一个点石成金的神器 xff0c 所有的行业 xff0
  • 一文看懂深度学习发展史和常见26个模型

    参加 2019 Python开发者日 xff0c 请扫码咨询 来源 AI部落联盟 xff08 ID xff1a AI Tribe xff09 作者简介 xff1a 沧笙踏歌 xff0c 硕士毕业于北京大学 xff0c 目前计算机科学与技术博
  • QT的QMessageBox

    QMessageBox是弹出的消息框 xff0c 分为 xff1a 错误 消息 问题 警告 span class token comment 具体参数如下 xff1a span span class token function criti
  • 我在旷视研究院做检测 | 技术头条

    作者 俞刚 xff0c 旷视研究院Detection组负责人 2014年博士毕业于新加坡南洋理工大学 xff0c 加入旷视 主要负责检测 xff0c 分割 xff0c 跟踪 xff0c 骨架 xff0c 动作行为等方面的研究以及算法落地工作
  • 63万张!旷视发布最大物体检测数据集Objects365 | 技术头条

    编辑 琥珀 来源 AI科技大本营 xff08 id xff1a rgznai100 xff09 昨日 xff0c 在旷视科技联合北京智源人工智能研究院举办的发布会上 xff0c 旷视研究院发布了物体检测数据集 Objects365 xff0
  • C语言中跨文件的全局变量

    声明 xff1a 突然看到这篇文章 xff0c 发现了c语言中使用全局变量的错误 xff0c 特转之 首先看一段代码 xff08 https gist github com 3760736 xff09 func c 1 2 3 4 5 6