stm32f103学习笔记——关键字extern、static、const

发布者:BeaLaity0170最新更新时间:2020-02-22 来源: eefocus关键字:stm32f103  关键字  extern  static  const 手机看文章 扫描二维码
随时随地手机看文章

1、extern


extern放在变量和函数声明之前,表示该变量或者函数在别的文件中已经定义,提示编译器在编译时要从别的文件中寻找。除此之外,extern还可以用来进行链接指定。


(1) 声明外部变量。在声明全局变量时,不同的文件在编译器编译时是不透明的,在A.c中定义 int i,同时在B.c中定义 int i,编译器编辑时是不会报错的,但是当链接linking...时会报错重复定义,链接是不同文件是透明的,因此在定义全局变量是不能够重复定义。当需要使用同一个全局变量时,如:在A.c中定义了int i,在B.c中需要调用i,只需要在B.c中声明extern int i,表示该变量在别的文件中已经定义,编译时便不会出错,在linking...的时候会自动去查找定义过的变量i。


(2) extern函数声明。Extern void fun() 暗示该函数可能在别的文件中定义过,它和定义为void fun(),没什么区别,其用处在于在复杂的项目用通过在函数前添加extern声明来取代利用include”*.h”来声明函数。


(3) 单方面修改函数原型。(对于这个功能我没怎么看懂,只说说自己理解,原文请参考:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html)。 当声明extern void fun(int i, int j,int k)时,在之后的调用中如果按照是fun(x,y,z)的原型调用时是没有问题的,但是如果要对该函数进行修改比如减少输入参数,调用时为fun(x,y)此时编译器就会报错了,解决方法就是去掉extern,该头文件中声明void fun(int i,int j),并对该函数进行修改,之后在调用的文件中包含该函数所在的头文件”*.h”即可。


(4) extern “C”。主要应用于C++环境下使用C函数,C++语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而C语言则不会,因此会造成链接时找不到对应函数的情况,此时C函数就需要用extern “C”进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名。


2、static


static在C++中的应用:面向过程程序设计、面向对象程序设计。


面向过程程序设计:


(1) 应用于普通变量和函数,不涉及类。当在变量前加上static如:static int a,定义了a为全局静态变量,一般全局静态变量不定义在头文件中,而是定义在源文件中,全局静态变量只对所在源文件透明,而在该文件之外是不可见的。在定义全局静态变量的时候声明和定义同时发生,即定义了static int a时就在全局变量数据区分配了内存,如果为给a赋值,则程序自动初始化为0(在函数体内声明的自动变量的值是随机的,除非它被显式初始化,而在函数体外被声明的自动变量也会被初始化为0)。


(2) 定义静态变量的好处:在其他文件中不会被引用;在不同的文件中可以出现相同的变量名。


(3) 通常,在函数体内定义了一个变量,每当程序运行到该语句时都会给该局部变量分配栈内存。但随着程序退出函数体,系统就会收回栈内存,局部变量也相应失效。


但有时候我们需要在两次调用之间对变量的值进行保存。通常的想法是定义一个全局变量来实现。但这样一来,变量已经不再属于函数本身了,不再仅受函数的控制,给程序的维护带来不便。


静态局部变量正好可以解决这个问题。静态局部变量保存在全局数据区,而不是保存在栈中,每次的值保持到下一次调用,直到下次赋新值。


静态局部变量有以下特点:


该变量在全局数据区分配内存;


静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的函数调用不再进行初始化;


静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0;


它始终驻留在全局数据区,直到程序运行结束。但其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。


(4) 静态函数。在函数前添加关键字static,表示该函数为静态函数,只对当前文件可见,对其他文件不可见。这样也可以在同一个项目中不同的文件定义相同的函数名,而不会出现错误。


面向对象程序设计:


(待续......)


在C语言中的应用:


   (1) 用于定义内部函数:static <函数类型>  <函数名> 表示该函数只对该文件可见,对其他文件不可见。


   (2) 声明全局静态变量:static <变量类型>  <变量名> static修饰的全局变量声明与定义同时进行,也就是说当你在头文件中使用static声明了全局变量后,它也同时被定义了;最后,static修饰全局变量的作用域只能是本身的编译单元,也就是说它的“全局”只对本编译单元有效,其他编译单元则看不到它 。


(个人认为:在c语言中的应用和在c++中面向过程程序设计的应用是一样的,本身C语言就是一种面向过程程序设计的语言。)


3、const


常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。可以避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。 同宏定义一样,可以做到不变则已,一变都变。 可以节省空间,避免不必要的内存分配。const可以被extern修饰,但是static是不可以被extern修饰。

关键字:stm32f103  关键字  extern  static  const 引用地址:stm32f103学习笔记——关键字extern、static、const

上一篇:stm32L151 tim trigger adc定时器触发单通道adc采样dma传输
下一篇:学习下stm32 配置 HSI作为系统时钟,但意义不大,一般不这样

推荐阅读最新更新时间:2024-11-10 18:10

stm32f103双串口收发(调试通过)
实现功能: 初始化三个串口,调用两个,一个串口发送一个串口接收 串口数据接收除接收数据外还需给出帧有效数据字节长度; 串口可使用USART1、USART2、USART3,串口参数能自由设置; 实现不定长数据帧的串口收发 设计思路及流程: 将中断串口参数设置初始化,中断函数的处理写在USART.C 文件里面,再使用主函数文件进行调用。 1. 建立usart.c usart.h 文件 3个串口的串口参数能自由设置,结构体初始化 Usart1: Usart2: Usart3: 中断函数编写: 定义中断函数数组 串口一中断函数; if(USART_GetITStat
[单片机]
<font color='red'>stm32f103</font>双串口收发(调试通过)
基于STM32F103RB微处理器和W5100芯片实现嵌入式Web服务器的设计
目前,网络化控制己成为远程控制的主要研究方向,利用网络实现对局域乃至全球范围内设备的监控是工业控制系统的发展趋势。嵌入式 Internet远程监控技术作为网络化控制的代表,它解决了工业控制领域中异构网络互联问题,提高了传统装备的智能化水平,促进了传统产业结构的调整。嵌入式Web服务器尤其适用于嵌入式Internet应用,它通过Ethernet或Modem的连接可以轻松连接到任何网络,真正实现对设备的远程管理和控制。 实现方案 嵌入式Web服务器必须具备的基本功能包括:可控制与其连接的设备并获取设备的状态和数据;现场信息可以网页形式发布;可及时响应远程用户的控制命令。此外,嵌入式设备应具有功能简单、功耗低和便携等特点。为此,设计
[单片机]
基于<font color='red'>STM32F103</font>RB微处理器和W5100芯片实现嵌入式Web服务器的设计
STM32F103V IWDG 独立看门狗操作
最近编写一个程序,因为需要考虑到可靠性,所以需要在程序了添加看门狗功能。查了下STM32的相关资料,于是利用下库文件来实现IWDG独立看门狗操作。首先需要调用库文件 #include stm32f10x_iwdg.h 再配置下看门狗相关参数 //////////独立看门狗IWDG设置//////////////////////////////////// void WatchDog_int(void)// 独立看门狗IWDG设置 { /* Enable write access to IWDG_PR and IWDG_RLR registers */ IWDG_WriteAccessCmd(IWDG_WriteAcces
[单片机]
STM32中将常量存储在FLASH中(CONST关键字
今天在写程序时,想把一个字符串常量存储在STM32的FLASH中,看了一会儿别人的例子程序,知道是用const这个关键字,但第一次没有成功。 前提:我用的是STM32F103ZE单片机, FLASH的存储范围为:0x08000000~0x0807ffff, RAM的存储范围:0x20000000~0x200007ff 失败例子: #include..... 。。。。 int main(void) { u8 const c = somen ; while(1); } 通过调试,查看c 数组的存储位置为0x200*****的位置,常量仍旧处在RAM中。 成功的例子: #include..... u
[单片机]
STM32F103_GPIO输入输出快速初始化
main.c文件 #include sys.h #include delay.h #include gpio.h uint8_t GetCNState; int main(void) { delay_init(); //延时函数初始化 GPIO_Quick_Init(GPIOA_Pin0,GPIO_Mode_Out_PP,1); //初始化A0为推挽输出模式,开始电平为1 GPIO_Quick_Init(GPIOB_Pin1,GPIO_Mode_Out_PP,0); //初始化B1为推挽输出模式, 开始电平为0 GPIO_Quick_Init(GPIO
[单片机]
STM32F103释放Jtag接口用做普通io
stm32上有两个调试接口,一个是比较通用的Jtag,一个是SWD。SWD占用的IO口更少,因此,我们可以用SWD来调试MCU,这样,除去swd的两条线,Jtag接口的另外三个口则可以用来作普通IO口使用,配置很简单,分享给各位: GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); G
[单片机]
STM32F103实现LED灯、按键、定时器编程
#include delay.h #include sys.h #include LED.h #include key.h #include timer2.h /* 程序功能:KEY0按下时,LED0 每秒闪烁一下;同时LED1熄灭(LED0慢闪)。 KEY1按下时,LED1 每秒闪烁二下;同时LED0熄灭(LED0快闪)。 WAKE_UP按下,LED0、LED1都熄灭。 硬件:LED0----GPIOA.8 LED1----GPIOD.2 KEY0----GPIOC.5 KEY1----GPIOA.15 KEY_WAKEUP----GPIOA.0 T
[单片机]
STM32F103ZET6 —— GPIO
STM32 的 GPIO 可以由软件配置成为几种不同的模式,每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问: A. 芯片侧: 1. 输入: 2. 输出: B. 硬件侧: 对应的单板,有两个GPIO连接到LED上: 使用的是 GPIO 的 Port G 的 Pin13 和 Pin14 脚 C. 代码侧: 配置上述两个 GPIO 工作需要的步骤如下: 1. 使能对应的 GPIO_G 的时钟 2. 配置 GPIO_G13/GPIO_G14 为通用推挽输出,配置口线翻转速度50M 3. 配置完成后,设置端口的输出为1/0即可控制 GPIO 的输出。 1. 时钟设置:
[单片机]
<font color='red'>STM32F103</font>ZET6 —— GPIO
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved