zoukankan      html  css  js  c++  java
  • 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修饰.

  • 相关阅读:
    pycharm-1
    WIN7、WIN10 右键在目录当前打开命令行Cmd窗口
    富文本框TinyMCE上传本地图片基本配置
    安装win10正式版后网速变慢的解决方法
    win10远程桌面出现身份验证错误。要求的函数不受支持
    C# 利用VS自带的WSDL工具生成WebService服务类
    解决IIS服务使用C#代码在Windows Server 2012上无法启动Excel的问题
    chorme浏览器不支持audio/video中的autoplay属性的解决方法
    iOS 内购笔记
    利用SortedMap对HashMap进行排序
  • 原文地址:https://www.cnblogs.com/HJiang/p/4197264.html
Copyright © 2011-2022 走看看