博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
extern static关键字
阅读量:5044 次
发布时间:2019-06-12

本文共 2977 字,大约阅读时间需要 9 分钟。

 

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

 

转载于:https://www.cnblogs.com/HJiang/p/4197264.html

你可能感兴趣的文章
javascript String
查看>>
ecshop 系统信息在哪个页面
查看>>
【转】码云source tree 提交超过100m 为什么大文件推不上去
查看>>
Oracle数据库的增、删、改、查
查看>>
MySql执行分析
查看>>
git使用中的问题
查看>>
yaml文件 .yml
查看>>
linux字符集修改
查看>>
phpcms 添加自定义表单 留言
查看>>
mysql 优化
查看>>
读书笔记 ~ Nmap渗透测试指南
查看>>
WCF 配置文件
查看>>
动态调用WCF服务
查看>>
oracle导出/导入 expdp/impdp
查看>>
类指针
查看>>
css修改滚动条样式
查看>>
2018.11.15 Nginx服务器的使用
查看>>
Kinect人机交互开发实践
查看>>
百度编辑器UEditor ASP.NET示例Demo 分类: ASP.NET...
查看>>
JAVA 技术类分享(二)
查看>>