C语言中static关键字的几种用法总结

前言

关于static关键字的使用,在大学期间并没有多少接触,后来才发现这货是真好用!
下面是我对static关键字在C语言中使用的一些总结,仅供参考。吾非大神,若有错漏之处,还请多多指点,大家一起交流学习。

正文

1. 变量

1.1 局部变量(函数体内)

局部变量定义在函数体内部

普通局部变量 是在任意一个函数内部定义的变量,这种变量不加static关键字,未赋初值时它的初值是不确定的,除非对它进行显式赋值,并且每次运行这个函数,这个局部变量都会被重新初始化。

静态局部变量 也是在任意一个函数内部定义的变量,需要加static关键字定义,未赋初值时的静态局部变量编译器会默认初始化为0,当再次运行该函数时,变量的值保持运行结果不变,不会被重新初始化。

程序演示:

#include <stdio.h>

void test(void)
{
	int n = 0;

	printf("n = %d\n", n);
	n++;
	printf("n++ = %d\n", n);
}

void test_static(void)
{
	static int n = 0;

	printf("static n = %d\n", n);
	n++;
	printf("static n++ = %d\n", n);
}

int main()  
{
	test();
	test_static();

	printf("-------------------------\n");
	
	test();
	test_static();	

    return 0;
}

运行结果:

n = 0
n++ = 1
static n = 0
static n++ = 1
-------------------------
n = 0
n++ = 1
static n = 1
static n++ = 2

1.2 全局变量(函数体外)

全局变量定义在函数体的外部

普通全局变量 对整个工程可见,其他文件若要直接使用可用extern关键字进行声明。也就是说其他文件不能再定义一个与其相同名字的变量了(否则编译器会认为它们是同一个变量)。

静态全局变量 仅对当前文件可见, 其他文件不可访问该变量,因此其他文件可以定义与之同名的变量,二者不会冲突。

因此,在程序中定义变量加上static关键字,可以有效的降低同一工程不同文件之间的耦合,避免不同文件同名变量的冲突。

2. 函数

非静态函数可以在另一个文件中直接引用,甚至不必使用extern声明

static在函数上的使用与全局变量类似,在函数的返回值类型前加上static,就是静态函数

静态函数 特性如下:

  • 静态函数只能在声明它的文件中可见,其他文件不能引用该函数
  • 不同的文件可以使用相同名字的静态函数,互不影响
/* file1.c */
#include <stdio.h>

static void fun1(void)
{
    printf("hello from static fun1.\n");
}

int main(void)
{
    fun1();
    fun2();

    return 0;
}


/* file2.c */
#include <stdio.h>

static void fun2(void)
{
    printf("hello from static fun2.\n");
}

使用gcc file1.c file2.c编译时,错误报告如下:

/tmp/cc2VMzGR.o:在函数‘main’中:
static_fun.c:(.text+0x20):对‘fun2’未定义的引用
collect2: error: ld returned 1 exit status

修改文件,去掉static修饰符,函数可在另一文件中引用:

/* file1.c */
#include <stdio.h>

void fun1(void)
{
    printf("hello from static fun1.\n");
}

int main(void)
{
    fun1();
    fun2();

    return 0;
}


/* file2.c */
#include <stdio.h>

void fun2(void)
{
    printf("hello from static fun2.\n");
}

运行结果如下:

hello from static fun1.
hello from static fun2.
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值