C/C++中static关键字

1.  static关键字修饰后的变量和函数由非静态变成了静态变量和静态函数,由全局变成了局部;
2.  static影响变量和函数的作用域(全局可见性)和存储位置(栈或静态存储区--生命周期)

 static存储位置:

    无论是全局变量还是局部变量(函数内部的静态局部变量))static变量都存储在全局/静态区域,在编译期就为其分配内存, 默认初始化为0,并不会因为函数的退出而释放空间,只有在程序结束时释放。
(static生命周期=程序的生命周期)


 static作用域:

     static变量和函数的作用域被限制在本文件内,只有本文件内的代码才能访问它,在其它文件中不可见,所以在其它文件中可以定义相同名字的变量和函数,不会发生冲突。

    所有未加static前缀的非静态全局变量和函数都具有全局可见性,其它的源文件也能访问,用extern声明,并包含H头文件即可。

多个文件公用一个全局变量,在H头文件用extern只声明一次:

//test.h

#ifndef __TEST_H
#define __TEST_H

extern char g_str[100]; // 声明全局变量g_str 
extern char a;          // 声明全局变量a

void fun1();            // 声明全局函数fun1

#endif


//test.c
char g_str[100];       // 定义全局变量g_str 
char a=5;              // 定义全局变量a

void fun1()            // 定义全局函数fun1
   {
    printf("a=%d\n", a);
   }



//main.c
#include "test.h"      //只需包含头文件即可,不用再次声明就可直接使用

Void main()
{
a=5;
fun1();

}

 多个文件公用一个全局变量,每个文件都要用extern声明一次:

//test.h

#ifndef __TEST_H
#define __TEST_H

//extern char g_str[100]; // 声明全局变量g_str 
//extern char a;          // 声明全局变量a

void fun1();              // 声明全局函数fun1

#endif


//test.c
char g_str[100];    // 定义全局变量g_str 
char a=5;           // 定义全局变量a

void fun1()         // 定义全局函数fun1
   {
    printf("a=%d\n", a);
   }


//多个文件公用一个全局变量,每个文件都要用extern声明一次:
//main.c
#include "test.h"

extern char g_str[];// extern variable must be declared before use
extern char a;      // 每个用到全局变量的文件都要声明一次
Void main()
{
a=5;
fun1();

}

要想在其它文件使用全局变量,必须包含对应头文件H,否则报错。

//test.h

#ifndef __TEST_H
#define __TEST_H

//extern char g_str[100]; // 声明全局变量g_str 
//extern char a;          // 声明全局变量a

//void fun1();            // 声明全局函数fun1

#endif


//test.c
char g_str[100];    // 定义全局变量g_str (其它文件可见)
char a=5;           // 定义全局变量a     (其它文件可见)

void fun1()         // 定义全局函数fun1  (其它文件可见)
   {
    printf("a=%d\n", a);
   }


//所以,要想在其它文件使用全局变量,必须包含对应头文件H。
//main.c
//#include "test.h" //未包含头文件

extern char g_str[];
extern char a;              

Void main()
{
a=5;              //如果未包含头文件,对于变量,无论是否用extern声明,都会报错
fun1();            //如果未包含头文件,对于函数,无论是否用extern声明,都不会报错,而是警告

}

C文件中用static声明变量,无法调用其它文件的静态全局变量,否则报错!,如下代码:

//test.h

#ifndef __TEST_H
#define __TEST_H


#endif


//test.c
static char g_str[100];       // 定义静态全局变量g_str (对外不可见)
static char a=5;              // 定义静态全局变量a     (对外不可见)

static void fun1()            // 定义静态全局函数fun1  (对外不可见)
   {
    printf("a=%d\n", a);
   }


//无法调用其它文件的静态全局变量和静态全局函数,否则报错!
//main.c
#include "test.h"      

extern char a;   
Void main()
{
a=5;      //Error:  Undefined symbol a (referred from main.o).
fun1();    //Error:  Undefined symbol fun1 (referred from main.o).

}

头文件中用static声明变量:

//1.头文件中用static声明变量,那么包含此头文件的每一个文件都会创建一个名称相同的变量,
//彼此独立,互不影响,初始值相同!对于没有包含的文件来说依然不可见。
//2.表面上在不同文件操作相同名称的变量,好像是操作同一个变量,实际是不同的变量!
//3.所以,一般定义static全局变量时,都把它放在原文件中而不是头文件

//test.h

#ifndef __TEST_H
#define __TEST_H

static char g_str[100];       // 声明静态全局变量g_str (对外不可见)
static char a=5;              // 声明静态全局变量a     (对外不可见)

void fun1();
#endif


//test.c


 void fun1()                 // 定义非静态全局函数fun1  (对外可见)
   {
    printf("a=%d\n", a);
   }


//无法调用其它文件的静态全局变量,否则报错!
//main.c
#include "test.h"      

  
Void main()
{
a=5;      //正确!
fun1();    //正确!

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

family20102010

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值