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修饰.