9.C语言 static和extern

2019-07-12  本文已影响0人  爱吃馒头的二饼

对函数的作用

外部函数:

extern用于声明或定义外部函数
定义的函数能被本文件和其他文件访问。
不允许有同名的外部函数
extern可以省略,因为默认情况下声明和定义的函数都是外部函数

#include <stdio.h>
extern void test()
{
    printf("调用了test函数\n");
}
extern void test();
int main()
{
    test();
    return 0;
}

内部函数:

static用于声明或定义内部函数
定义的函数只能被本文件访问
允许不同文件中有同名的内部函数

#include <stdio.h>
static void test()
{
    printf("调用了test函数\n");
}

此时如果在外部文件调用test函数会报错:
Undefined symbols for architecture x86_64:
"_test", referenced from:
_main in HelloWord-a2ffb8.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

对全局变量的作用

全局变量分两种:

外部变量:能被本文件和其他文件访问

extern 声明一个外部变量
默认情况下,所有的全局变量都是外部变量
不同文件中的同名外部变量,都代表着同一个变量

#include <stdio.h>
int a;
void test()
{
    printf("调用了test函数,a的值是%d\n",a);
    a = 100;
}
#include <stdio.h>
int a;
void test();
int main()
{
    a = 10;
    
    test();
    
    printf("调用完test函数后,a的值是%d\n",a);
    return 0;
}
结果:

调用了test函数,a的值是10
调用完test函数后,a的值是100

内部变量:只能被本文件访问,不能被其他文件访问

static:定义一个内部变量
不同文件中的同名内部变量,互不影响

#include <stdio.h>
static int a;
void test()
{
    printf("调用了test函数,a的值是%d\n",a);
    a = 100;
}
#include <stdio.h>
static int a;
void test();
int main()
{
    a = 10;
    
    test();
    
    printf("调用完test函数后,a的值是%d\n",a);
    return 0;
}
结果:

调用了test函数,a的值是0
调用完test函数后,a的值是10

对局部变量的作用

延长局部变量的生命周期:程序结束的时候,局部变量才会被销毁
并不会改变局部变量的作用域
使用场合:如果某个函数的调用频率特别高,并且函数内部的某个变量值是固定不变的,就可以使用static修饰该局部变量,可以避免多次分配内存空间

#include <stdio.h>
static int a;
void test()
{
    int a = 0;
    a++;
    printf("a的值是%d\n",a);
    
    static int b = 0;
    b++;
    printf("b的值是%d\n",b);
}
int main()
{
    test();
    test();
    test();
    return 0;
}
结果:

a的值是1
b的值是1
a的值是1
b的值是2
a的值是1
b的值是3

上一篇 下一篇

猜你喜欢

热点阅读