1.static
- static修饰的变量,自始至终只有一块空间,当前文件才能使用,生命周期是从定义开始直到程序结束;
- 全局变量的定义是在.c文件中,但是声明全局变量是在.h中;
- static:静态型,用它定义的变量自动初始化为0值或空值,常用于修饰变量或函数,只能在当前".c"文件中使用,static类型的变量只用一块空间,并且此变量的值有继承性;
practice.h头文件
//防止此practice.h头文件被很多文件调用使得重复包含
#ifndef _PRACTICE_H
#define _PRACTICE_H
void call_func();
#endif // !_PRACTICE_H
main.c
#include <stdio.h>
#include "practice.h"
static int i = 10; //static定义变量,只能在当前 main.c 文件中使用
int main ()
{
printf("[%s]i = %d\n",__FUNCTION__,i); //__FUNCTION__代表是在哪个函数
call_func(); //直接调用接口去调内部的func函数
return 0;
}
practice.c源文件
#include <stdio.h>
//static把func函数隐藏起来,封装一层
static void func ()
{
int i = 2;
printf("[%s]i = %d\n", __FUNCTION__, i);
}
void call_func()
{
func();
}
result:
2.extern
- extern不能改变被引用的变量的值和类型,是说明型不是定义用的;
practice.h头文件
//防止此practice.h头文件被很多文件调用使得重复包含
#ifndef _PRACTICE_H
#define _PRACTICE_H
void func();
#endif // !_PRACTICE_H
main.c
#include <stdio.h>
#include "practice.h" //自定义的头文件用""
int i = 10; //定义一个全局变量i,其他文件也可以引用
//程序先进入main主函数,在main里往下调用其他文件或本文件中的功能函数
int main ()
{
printf("[%s]i = %d\n",__FUNCTION__,i); //__FUNCTION__代表是在哪个函数
func(); //调用func()是在其他文件中的函数,要在头文件中包含一下
return 0;
}
practice.c源文件:放源功能函数的定义
#include <stdio.h>
//函数func本身的定义写在本.c文件中
void func ()
{
//extern不能改变被引用的变量'i'的值和类型
extern int i; //说明变量i是外部引用的
printf("[%s]i = %d\n", __FUNCTION__, i);
}
result:
注:函数头文件的声明前加extern与不加extern有什么区别?
函数默认是extern属性,声明时加不加extern没区别,C语言中,extern修饰符用在变量或函数声明前,说明此变量或函数是在别处定义的,要在此引用;