2022-04-01 C中的extern 和static

在c语言中,定义在所有函数之外的变量称全局静态变量,具有外部连接性,全局性,全程序存储期。

换成人话,就是可以在定义之前进行调用,只需要进行extern的声明即可。所有函数可调用。同时,只要程序还在执行,它就不会被抹除。

当外部变量被static修饰,就发生了变化,此时它被成为外部静态变量,这个词简直就是误导,此外部就不是文件外部,而是函数外部了,也就是说,这个变量不能用在其定义之前的代码使用,也不能被跨文件使用,哪怕用extern修饰的声明也是不可以的。

在多文件编译的时候,一个非static修饰的全局静态变量只能被定义一次,其他文件想要使用此变量,需要用extern进行修饰声明。但是,static修饰的外部静态变量则可与上面的全局静态变量使用一个名字,且此文件作用域内,静态变量的值一定是static修饰的变量的值,而非其他。

#include 

int main()
{
    extern int traveler; //正确,traveler没有被static修饰,是外部连接的。
    extern int stayhome; //错误,stayhome被static修饰,是内部连接的,只在定义之后可用,不可向前调用。
    printf("%d %d\n", traveler, stayhome);
    return 0;
}


int traveler = 1;

static int stayhome = 1;

这有什么用?我的想法是经static修饰的全局静态变量,不会干扰其定义前的头文件中的变量内容,想象,一旦一个全局变量定义后,可以在前后引入的所有文件都可用,绝对是一件很可怕的事情,如果涉及文件太多,那就是幽灵般的存在,此时一不小心引入的bug,恐怕十分难缠。

你可能感兴趣的:(笔记,C,static,extern)