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#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....\n"); 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#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....\n"); test2();}static void test2(){ printf("b test2 static...\n");}
//// main.m// extern和static//// Created by HJiang on 15/1/1.// Copyright (c) 2015年 HJiang. All rights reserved.//#import#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\n",num); test2();}static void test2(){ testb(); printf("a test2 static...");}
1.2 static修饰局部变量
static修饰局部变量,只会创建一次,后期不会再分配,其实就是延长变量的生命周期但是不会修改作用域,只有程序结束时才会消失;
如:
void test2(){ static int a = 0; a++; printf("a=%d\n",a); int b = 0; b++; printf("b=%d\n",b);}int main(){ test2(); test2(); test2(); return 0;}
运行结果:
a=1b=1a=2b=1a=3b=1Program ended with exit code: 0
再次调用test2方法 变量a不会再重新分配 int a相当于会被忽略,而变量b会重新分配。
static修饰局部变量会把变量存放在常量区中,static修饰局部变量可以让方法再次使用时都共享一个变量,并且不会重新分配变量,会使用上次分配的变量。
使用场景:方法调用很频繁,并且局部变量值都是相同时,可以使用static修饰.