extern static关键字

extern和static对函数的作用

extern:  

c语言中默认情况下函数都是使用extern修饰为外部函数,其他文件都可以进行调用, 可以省略.  加上extern可以完整的申明和定义为一个外部函数 ,函数默认为extern

  例如:extern void test(); void test()是一样的

static:

  定义一个内容函数和java中得staic不一样,用static修饰的函数只能在本文件中使用,不能被其他文件使用.

  例如:static void test();

区别:

extern:1.申明和定义一个外部函数 2.默认所有函数都是extern,可以省略 3.不允许不同文件中含有同名函数.

static: 1.申明和定义一个内部函数 2.只能在本文件中调用 3.允许在不同文件中可以有同名的函数

两者可以间接调用.

//
//  a.h
//  OC知识点
//
//  Created by HJiang on 15/1/1.
//  Copyright (c) 2015年 HJiang. All rights reserved.
//

#ifndef __OC_____a__
#define __OC_____a__

#include <stdio.h>

#endif /* defined(__OC_____a__) */

extern void testa();
static void test2();
//
//  a.c
//  OC知识点
//
//  Created by HJiang on 15/1/1.
//  Copyright (c) 2015年 HJiang. All rights reserved.
//

#include "a.h"
#include "b.h"

extern void testa(){
    printf("testa....
");
    test2();
}

static void test2(){
    testb();
    printf("a test2 static...");
}
//
//  b.h
//  OC知识点
//
//  Created by HJiang on 15/1/1.
//  Copyright (c) 2015年 HJiang. All rights reserved.
//

#ifndef __OC_____b__
#define __OC_____b__

#include <stdio.h>

#endif /* defined(__OC_____b__) */

extern void testb();
static void test2();
//
//  b.c
//  OC知识点
//
//  Created by HJiang on 15/1/1.
//  Copyright (c) 2015年 HJiang. All rights reserved.
//

#include "b.h"
#include "a.h"

extern void testb(){
    printf("testb....
");
    test2();
}

static void test2(){
    printf("b test2 static...
");
}
//
//  main.m
//  extern和static
//
//  Created by HJiang on 15/1/1.
//  Copyright (c) 2015年 HJiang. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "a.h"
#import "b.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"Hello, World!");
        testa();
        test2();
    }
    return 0;
}

运行结果:

2015-01-01 16:13:20.828 extern和static[1334:79996] Hello, World!
testa....
testb....
b test2 static...
a test2 static...

extern和static对变量的作用

  变量分全局变量和局部变量, 全局变量又分:外部和内部

 1.1 extern,static对修饰全局变量

  外部变量:能被本文件和其他文件访问;内部变量:只能在本文件中访问

  默认情况下所有全局变量都是外部变量,其他文件也可以访问,例如:a.c中有一个变量int num , b.c文件中有一个变量int num,二个变量是同一个,在c.c文件中可以访问num;

  外部全局变量:此变量默认为外部全局变量,其他文件也可以访问 如int num;

  内部全局变量:用static修改的全局变量为内容全局变量 如:static int num;

  extern修饰全局变量表示明确申明此变量为外部全局变量 如:extern int num; 但是不能赋值操作,只能是申明而且;

  static修饰全局变量表示申明一个内部全局变量,不同文件中的同名全局变量相互不影响,可以赋值操作;  

//extern int num;
static int num = 3;
extern void testa(){
    printf("testa....%d
",num);
    test2();
}

static void test2(){
    testb();
    printf("a test2 static...");
}

 1.2 static修饰局部变量

  static修饰局部变量,只会创建一次,后期不会再分配,其实就是延长变量的生命周期但是不会修改作用域,只有程序结束时才会消失;

  如:

   

void test2(){
    static int a = 0;
    a++;
    printf("a=%d
",a);
    
    int b = 0;
    b++;
    printf("b=%d
",b);
}

int main()
{
    test2();
    test2();
    test2();
    
    return 0;
}

运行结果:

a=1
b=1
a=2
b=1
a=3
b=1
Program ended with exit code: 0

再次调用test2方法 变量a不会再重新分配 int a相当于会被忽略,而变量b会重新分配。

  static修饰局部变量会把变量存放在常量区中,static修饰局部变量可以让方法再次使用时都共享一个变量,并且不会重新分配变量,会使用上次分配的变量。

  使用场景:方法调用很频繁,并且局部变量值都是相同时,可以使用static修饰.

原文地址:https://www.cnblogs.com/HJiang/p/4197264.html