欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c语言中的static关键字

程序员文章站 2022-07-11 17:58:10
...

static关键字

今天在库文件中定义一个全局变量时加了static关键字
经过一番操作后,在另一个文件中查询这个值怎么都没改变,找了半天就是不知道哪里出问题了,定神想了想才醒悟是不是定义搞错了,我一直记得static 会为变量分配内存,并唯一的初始化一次,循环里经常用,其他性质有些记不清了。
这一次,我再好好总结一下const,static,extern这三个关键字的用法

const

const修饰的量为一个常量即不能被修改的量,但要使用const修饰的量就需要对其进行初始化

特点
1)const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。
2)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。

static

在使用 static 关键字修饰变量时,我们称此变量为静态变量

特点
1)静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。
2)全局变量定义在函数体外部,在全局数据区分配存储空间,且编译器会自动对其初始化。普通全局变量对整个工程可见,其他文件可以使用extern外部声明后直接使用。也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。

静态全局变量仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。

这句太关键了,static定义在.h文件中其他文件可以调用,但是调用时的实例与static文件中的无关,在外部如何改变其值,作用域只在那个文件内部!

/****stm32f107.h****/
#ifndef __STM32F107_H
#define __STM32F107_H
#define MASTER_HEADER_PAGEADDR    3071        //主机APP头信息地址
#define MASTER_DATA_PAGEADDR      3072        //主机APP开始地址
#define SLAVE_UPDATE_PAGE     3586  //从机APP文件信息头
#define SLAVE_UPDATE_HEAD     3585  //3586~4096页为从机地址
static uint16_t HEAD_ADDR = SLAVE_UPDATE_HEAD;
static uint16_t DATA_ADDR = SLAVE_UPDATE_PAGE;

/****main.c****/
#include "stm32f107.h"
HEAD_ADDR = MASTER_HEADER_PAGEADDR;
DATA_ADDR = MASTER_DATA_PAGEADDR;

上面无论如何改变HEAD_ADDR的值,都只在调用的文件中生效,在另一个文件中查看HEAD_ADDR永远等于SLAVE_UPDATE_HEAD

extern

全局变量可以为本文件中的其他函数所共用,它的有效范围为从定义变量的位置开始到本源文件结束。extern 修饰后与全局变量共用一个变量,无论声明多少个extern 该变量具有唯一的实例。

/****max.c****/
#include <stdio.h>
/*外部变量声明*/
extern int g_X ;
extern int g_Y ;
int max()
{
    return (g_X > g_Y ? g_X : g_Y);
}
/***main.c****/
#include <stdio.h>
/*定义两个全局变量*/
int g_X=10;
int g_Y=20;
int max();
int main(void)
{
    int result;
    result = max();
    printf("the max value is %d\n",result);
    return 0;
}

总结

基础很重要,要不在编译器不识别错误时就会找的一头雾水,有很多自以为知道的知识如果深挖都会有新的发现,切勿浮沙筑高台。

相关标签: 基础