c/c++语言中有很多地方要用到extern,但是如果没有真正的了解它的意义,会给编程带来很大的麻烦,为了使大家少走弯路,特祥细的说明一下。
对于比较小的程序,一般只有一个c文件和一个头文件,全局变量我们通常会直接定义在c文件中,在程序之前加int i定义。如果要在头文件中定义有以下两种方法:用extern来声明:extern int i;这一句只是对变量i进行声明,在c文件的程序之前必须加上int i进行定义。extern int i=0;这一句声明和定义都做了。
对于大一点的程序,有很多c文件和头文件,这个时候全局变量就必须在头文件中声明(不需要初始化),然后在一个c文件中定义(该初始化的要初始化)。如果在头文件中定义,则编译的时候会出现重复定义的错误。如果只有头文件中声明就会出现没有定义有警告。
*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
SYMBOL: K
MODULE: 222.obj (222)
出现上述错误则是因为变量k重复定义,把你的头文件中的变量定义前加extern(只是变量声明不用初始化),再在某一个你要调用该变量的c文件的程序之前再定义(注意第一个调用的c文件要负责附带初始化该变量,其他调用的c文件就不需要初始化过程啦)一下就可以了。
要想深入了解extern的作用的话,还是需要了解一些编译原理的东西
我们一般说的编译(build),其实是两个过程,第一个过程称为编译(compile),第二个过程是链接(link)编译的单位是文件,即单个的C文件,因此即使一个变量没有定义就使用了,编译器是不会报错的,编译器认为这个变量应该是在其它文件中被定义了,先作为一个符号放这儿,等一会儿再说。而在链接的阶段,链接器就要处理这些跨文件的符号(包括变量、函数等),如果在其它文件中找到了,且是唯一被定义的,就把所有文件中具有全局作用域的同一符号链接为一个东西。
所以,在多个文件的情况下,如果有全局变量需要在多个文件中使用,只需要在一个文件中定义它,在其它文件中使用extern声明一下就可以了,加了extern的意思是显式的告诉编译器,这个变量是在其它文件中被定义的,在编译的时候你略过就可以了,链接器会处理好的,这样编译器就不会报错了。
关键字:51笔记 keil c文件 变量
引用地址:
51笔记2:keil中建立多个c文件时,变量重复定义
推荐阅读最新更新时间:2024-03-16 14:31
(笔记总结)80C51的中断系统
80C51的中断系统的结构 80C51的中断系统有5个中断源,2个中断优先级,可实现二级中断嵌套。 1.(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上有有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。 2.(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上有有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。 3.TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断。 4.TF1(TCON.7),
[单片机]
C8051F学习笔记3:优先权交叉开关译码器
数字和模拟资源可以通过25个I/O引脚(C8051F320)每个端口引脚都可以被定义为通用I/O(GPIO)或模拟输入。P0.0 ~ P2.3可以被分配给内部数字资源 特点: 所有端口I/O都耐5V电压。 端口I/O单元可以被配置为漏极开路或推挽方式。 端口I/O初始化 端口 I/O 初始化包括以下步骤: 1.用端口输入方式寄存器(PnMDIN)选择所有端口引脚的输入方式(模拟或数字)。 2.用端口输出方式寄存器(PnMDOUT)选择所有端口引脚的输出方式(漏极开路或推挽)。 3.用端口跳过寄存器(PnSKIP)选择应被交叉开关跳过的那些引脚。 4.将引脚分配给要使用的外设(XBR0、XBR1)。 5.使能交叉开关(XB
[单片机]
MSP432(Keil5)——3.delay延时驱动
本次示例中的延时函数采用了系统内部的systick时钟,学习了正点原子的延时函数写法。 如果你移植出来不是标准的延时,那么就是你的时钟频率设置的不对,我的是48MHz。 delay.c #include delay.h static uint8_t fac_us=0; //初始化延时函数 void Delay_Init(void) { fac_us = SystemCoreClock / 1000000; } //延时us void delay_us(uint32_t nus) { uint32_t temp; SysTick- LOAD=(uint32_t)(nus*fac_us);
[单片机]
使用keil3编程测试程序运行时间
时间是跟晶振频率有关,默认的晶振频率是24MHz;此处的晶振频率一定要与开发板的晶振频率保持一致。 注意:修改后一定要重新进行编译后,再进行测试 1、设置晶振频率的位置: 2、 在24MHz的晶振频率下,程序运行到断点的时间是0.045s 3、我们将晶振频率改为12MHz后,再全速执行到断点处,时间为24MHz的2倍了。
[单片机]
Proteus和Keil软件在单片机项目式教学中的应用
《单片机原理与应用》是高职机电类专业的核心课程之一,也是一门综合性、实践性、应用性很强的专业课。传统的单片机课程教学采用“先理论讲解,再动手实验”的教学模式,该教学模式造成学生理论知识与实践应用严重脱节,忽视了对学生创新能力和综合运用知识的能力的培养,教学效果并不理想。目前一种新的教学方法即项目式教学法被许多高职院校应用与单片机课程教学中,这种教学方法将理论教学和实践教学有机结合,有利于培养学生单片机的应用综合能力,提高了学生的综合职业能力,取得了良好的教学效果。但是在课程实施过程中也遇到了一些问题。第一实施项目式教学要求采购大量的硬件设备,而且单片机技术发展日新月异,设备的更新维护都需要投入大量的经费。第二在单片机项目式
[嵌入式]
在KEIL中实现C语言嵌套汇编语言
一、讲解背景 在单片机学习的过程中,掌握一点汇编语言是非常有必有的,作为低级语言汇编语言在单片机开发中有它不可取代的作用,比如每条指令可以精确的确定延时时间,便于理解非常适合硬件工程师学习。但是要提高单片机技能,必须掌握C 语言编程,因为C 语言有强大的模块化管理思想。我想在很多人学习的过程中即学了汇编语言,又学习了C 语言,那么一个问题便随之而产生,如果将C 语言与汇编语言相互结合,达到更好的编程效果,本次讲解就是基于这个问题而生成的。 二、操作步骤 第一步: 在KEIL 中新建工程及文件并复制以下程序并保存为C 文件: /* 功能:C 语言里嵌套汇编语言,起到抛砖引玉的作用 作者:三维电子杨荣国 日期:2010
[单片机]
STM32软件运行过程,如何查看全局变量的实时数据
下面是一个单片机STM32RCT6的PA8,PA9,PA10引脚输出PWM波形的仿真步骤,此外还展示了软件运行过程,如何查看全局变量的实时数据。每一步我都做了截图,大家照着一步步来,请大家放心参考! 1.点target图标,如下: 2.选择好单片机芯片的型号:我选的STM32RCT6型号,大家可以根据自己手上stm32开发板的型号来选择 3.外部晶振频率的选择:8Mhz(因为大部分单片机的外部晶振是8Mhz),为了使仿真更贴近实际,通常情况下都是选8Mhz 4.进入Debug页面进行设计,特别要注意第四点parameter,注意选正确好芯片的型号,我的是RC系列,所以写了RC,如果是RB系列,要后面改为RB 5
[单片机]
什么是变量?PLC变量哪些部分组成?
变量 变量是用于程序的,可以有不同值的变量。 根据应用范围,变量可分为以下几类: ● 局部变量: 局部变量仅适用于定义这些变量的块。 ● PLC 变量:PLC 变量适用于整个 PLC。 程序中多数指令都通过变量来操作。 为指令分配变量后,即会使用指定变量的值来执行该指令。 变量在 TIA Portal 中集中管理。 在程序编辑器中创建 PLC 变量与在 PLC 变量表中创建 PLC 变量没什么区别。 如果在程序或 HMI 画面的多个位置使用某个变量,则对该变量所作的更改会立即在所有编辑器中生效。 PLC 变量 PLC 变量由以下部分组成: ● 名称(例如,CONVEYOR_ON): 变量名称只对一个 PLC 有效,
[嵌入式]