extern什么意思 ios_ios extern - CSDN
  • iosexternextern "C

    2019-08-07 10:29:29
    extern 在一个项目中必须保证函数、变量、枚举等在所有的源文件中保持一致,除非指定定义为局部的。一个全局变量在所有的模块当 中只能被声明一次,否则会出现链接错误。但是可以声明很多次,且声明必须保证类型一致...

    extern

    在一个项目中必须保证函数、变量、枚举等在所有的源文件中保持一致,除非指定定义为局部的。一个全局变量在所有的模块当

    中只能被声明一次,否则会出现链接错误。但是可以声明很多次,且声明必须保证类型一致。用 extern 声明时一个变量时,并

    不是定义一个变量,也不会为变量分配内存空间。extern 是 c/c++ 语言中表明函数和全局变量作用范围(可见性)的关键字,该

    关键字告诉编译器,其声明的函数或变量可以在本模块或者其他模块中使用。通常,在模块的头文件中对本模块提供给其他模块

    使用的函数和全局变量以关键字 extern 声明。

    例如:如果模块 B 想要引用模块 A 中定义的全局变量和函数时,只包含模块 A 的头文件即可。这样,模块 B 调用模块 A 的函数时,在编译阶段,模块 B 虽然找不到该函数,但是并不会报错,它会在链接阶段中从模块 A 编译生成的目标代码中找到此函数。
    与 extern 对应的关键字是 static。被 static 修饰的全局变量或函数,只能在本模块中使用。因此,一个函数或变量只能在本模块中使用时,不能够使用 extern 修饰。

    extern "C"

    一个 C++ 程序中可能包含其他语言编写的部分代码,同样,C++ 编写的代码片段也可能被用在其他语言编写的代码中。

    但是,不同语言编写的代码相互调用是困难的,更何况用同一种语言编写,使用不同编译器进行编译的情况。

    因为,不同语言或者同种语言在不同编译器上编译时,在注册变量,传递参数和参数在栈上的布局上可能存在差异。为了使它们

    遵守统一规则,可以使用 extern 指定一个编译和链接规约。extern “C” 指令中的 C,表示的是一种编译和链接规约,而不是一种

    语言。C 表示符合 C 语言的编译和链接规约的任何语言。还要说明的是,extern “C” 指令指定的编译和链接规约,不会影响语

    义,只是改变编译和链接的方式。如果很很多语句要加上 extern "C",可以将它们放到 extern "C" {} 中。

    展开全文
  • iOSextern关键字

    2017-08-22 17:49:34
    相信接触过java / Android...但iOS static 与 Android static名称虽然一致,但实际使用完全不同,具体区别可以参考拙作    iOS 和 Android,一对天生的欢喜冤家,虽然系统和API完全不同,如果熟悉这两门语言,还是可

         iOS 和 Android,一对天生的欢喜冤家,虽然系统和API完全不同,但可以找到很多功能相通的地方,如Android的关键字final 与 iOS的const。相信接触过java都知道如何使用static关键字,比起动不动就new一个对象来说,静态变量/方法在某些地方的使用更具备优势。iOS 与 Android 的static用法是一样的吗?答案当然是否,两者虽然长相一致,但用法却不尽相同,感兴趣的朋友可以参考这篇文章

         那么Android static对应着iOS哪个关键字呢?答案就是:extern。下面就让我们来看看extern的用法。题外话:实现类变量的方法还有很多,如利用AppDelegate、自定义单例、NSUserDefault,但个人觉得还是不够简单。直接上代码: 


    1、新建一个空白工程,只修改ViewController.m文件(用于定义类变量)和AppDelegate.m文件(用于使用类变量),其他文件不动。

    经过测试,可以在多处地方定义类变量,请参考上图注释。


    2、接下来,使用extern关键字表示引入全局变量,自动匹配工程,找到与当前(extern + 类型 + 变量名) 匹配的 (类型 + 变量名),接下来就可以对这个全局变量进行取值赋值操作了。



    下面来看一段代码:

    //  
    //  NSSingletonFactory.h  
    //  单例模式的简单使用  
    //  
    //  Created by apple on 15/9/28.  
    //  Copyright (c) 2015年 LiuXun. All rights reserved.  
    //  
    // 单例工厂类  
    #import <Foundation/Foundation.h>  
    #define SingleFactory [NSSingletonFactory shareFactory]  
      
    #ifdef __cplusplus  
    extern "C"{  
    #endif  
        id SingleForClass(Class a);  // 已在.m 中添加函数的函数声明  
    #ifdef _cplusplus  
    }  
    #endif  
      
    @interface NSSingletonFactory : NSObject <NSCopying>  
    {  
        NSMutableDictionary *data;  
    }  
      
    +(NSSingletonFactory *) shareFactory;  
    -(id)shareInstanceFor:(Class) aclass;  
    -(id) shareInstanceFor:(Class)aclass category:(NSString *)key;  
      
    @end  

    可以发现有这么一句:extern "C"

    如: extern "C" void fun(int a, int b);是为了告诉编译器:以C语言的方式编译和连接封装函数,而不是C++的。因为C++的规则在翻译这个函数名时会把fun这个名字变得面目全非,可能是fun@aBc_int_int#%$也可能是别的,这要看编译器的"脾气"了(不同的编译器采用的方法不一样),为什么这么做呢,因为C++支持函数的重载。


    部分参考:http://blog.csdn.net/u013074465/article/details/42738553

    展开全文
  • extern首先看代码示例:GDGPerson.m 文件#import "GDGPerson.h"@implementation GDGPerson int age = 10; @end main.m文件 ,不用包含GDGPerson类的头文件#import <Foundation/Foundation.h>int main(int argc, const...

    extern

    首先看代码示例:

    GDGPerson.m 文件

    #import "GDGPerson.h"
    
    @implementation GDGPerson
    
     int age = 10;
    
    
    @end
    

    main.m文件 ,不用包含GDGPerson类的头文件

    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
    
            extern int age;
            age = 30;
    
            NSLog(@" %d", age);
    
    
        }
        return 0;
    }
    

    在工程中新添加一个GDGPerson的类

    GDGPerson.m里写 int a = 10; ,在main.m里写 int a ;,NSLog(@"%d",a);打印会报错

    因为无法引用外部变量

    int a;前加上extern,就可以打印出来,a的值是10

    只要你在全局变量前加extern,你的这个文件就可以访问这个全局变量

    首先清楚一点,默认条件下,全局变量的是整个程序都能访问的

    记住! extern int a; 是并没有分配内存的,这样写不是定义变量

    怎么写是定义变量?

    int a; 这样写才是定义变量。

    main.m里怎么修改a 的值才不会报错?

    这样写 a = 30;

    打印出来的值a 是30

    所以记住

    任何情况下全局变量都是不安全的!为什么? 随时可能会被别人改掉。

    总结:

    <1>要想访问全局变量可以在前面加extern

    <2>extern修饰的变量没有真正内存


    static

    1.修饰全局变量

    GDGPerson.m文件

    #import "GDGPerson.h"
    
    @implementation GDGPerson
    
     static int age = 10;
    
    
    @end
    

    main.m文件 不用包含GDGPerson类的头文件

    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
    
            extern int age;
    
            NSLog(@" %d", age);
    
    
        }
        return 0;
    }
    

    那么我想我定义的全局变量只允许本文件访问,其他文件不能访问,怎么办?

    简单,在int a = 10; 前加static

    只要在全局变量前加static,那么这个全局变量的作用域就会缩小到当前文件,外界就不能访问了。

    这时请在GDGPerson.m文件 int a = 10; 前加static,再运行程序,就会发现报错了

    好处:保证全局变量安全,外界不可访问与修改

    总结:static修饰全局变量,全局变量的作用域仅限于当前文件


    2.修饰局部变量的作用

    先看代码示例:

    main.m文件

    void test()
    {
        static int a = 0;
        a++;
        NSLog(@"a = %d", a);
    }
    
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
    
             for (int i = 0; i<3; i++) {
               test();
           }
    
    
        }
        return 0;
    }

    修饰局部变量时,作用域仅限于test函数的大括号,其他地方都不顶用

    test这个函数中如果不加static,那么a打印出来的结果永远是1

    因为每当调用一次函数,就会定义一个新的变量

    每次a的值都是零,加加后就是1


    但是加上static后,含义就不一样了

    再打印的结果就是1,2,3

    因为被static修饰的变量只会初始化一次,永远都只有一份内存

    所以当第一次调用test函数时

    a有一个内存空间,并且值是0

    第二次再调用test函数时由于int a被 static 修饰

    所以不会再初始化新值

    它会拿到之前的那份内存加加,就会变为1

    以此类推,之后就会变为2,3

    好处:保住所修饰变量的命,保证它不会挂

    总结:

    <1>让局部变量只初始化一次

    <2>局部变量在程序中只有一份内存

    <3>并不会改变局部变量的作用域,仅仅是改变了局部变量的生命周期(只到程序结束,这个局部变量才会销毁)

    展开全文
  • 一、extern 与函数 如果一个程序有多个.c源文件 ,每个源文件在编译后会对应一个.obj文件 ,这些目标文件之间可能有关联,把它们链接在一起再生成可执行文件 。 外部函数:当前文件定义的函数允许其他文件访问...

    一、extern 与函数

    如果一个程序有多个.c源文件  ,每个源文件在编译后会对应一个.obj文件 ,这些目标文件之间可能有关联,把它们链接在一起再生成可执行文件 。

    • 外部函数:当前文件定义的函数允许其他文件访问。不可以有同名的名部函数;
    • 内部函数:当前文件定义的函数不允许其它文件访问、调用,只能在内部使用,称为内部函数。内部函数可以重名。
    </pre>main.c<pre name="code" class="objc">//
    //  main.c
    //  firstC
    //
    //  Created by 谢厂节 on 15/1/13.
    //  Copyright (c) 2015年 xundh. All rights reserved.
    //
    #include <stdio.h>
    #include "waibu.h"
    
    //extern void waibu(); //默认就是extern  所以可以省略
    
    int main(int argc,const char *argv[])
    {
        waibuhanshu();
    }
    

    waibu.c
    #include "waibu.h"
    
    extern void waibuhanshu(){ //默认就是extern
        printf("test");
    }


    waibu.h
    #ifndef __firstC__waibu__
    #define __firstC__waibu__
    
    #include <stdio.h>
    
    #endif /* defined(__firstC__waibu__) */
    
    void waibuhanshu();

    二、static与函数

    与extern对应,static指函数是内部函数,不允许外部调用。

    展开全文
  • 最新项目上线,抽空写下博客,记录一些基础知识1.const和宏 区别 const:常量 const:当有字符串常量的时候,苹果推荐我们使用const const与宏的区别 1.编译时刻: 宏:预编译 const:编译时刻 2.编译检查: 宏:不会检查...
  • extern,作用在IOS中,为了使用全局变量。比写在appDelegate和定义单例方便一些; 举例: 1.MyExternClass.h添加这个类,并在.m文件添加 代码 #import "MyExtern.h" @implementation MyExtern NSString *...
  • 使用extern关键字法:  1 、新建Constants.h文件(文件名根据需要自己取),用于存放全局变量;  2、 在Constants.h中写入你需要的全局变量名,但是在定义时不能对其进行初始化,否则就出错例如:  ...
  • const,static,extern简介一、const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量。执行时刻:宏是预编译(编译之前处理),const是编译...
  • 之前,在在objc项目中使用常量中,使用c的预处理#define来设置常量。比如,可以做个头文件,然后在需要的类文件中import,使用常量。...extern NSString * const kInitURL; @interface Constants : NSOb
  • 在这里做了一个Demo,ViewController声明外部变量并使用,ExternViewController负责修改外部变量的值  ViewController.m #import "ViewController.h" ...NSString *externString = @"234"; @interface
  • iOS extern使用教程

    2013-11-06 15:57:07
    ios开发使用extern访问全局变量 使用extern关键字法:  1 、新建Constants.h文件(文件名根据需要自己取),用于存放全局变量;  2、 在Constants.h中写入你需要的全局变量名,但是在定义时不能对其进行...
  • 本篇主要介绍在开发中怎么使用const,static,extern3个关键字,如果喜欢我的文章,可以关注我微博:吖了个峥,也可以来小码哥,了解下我们的iOS培训课程。后续还会更新更多内容。。。 一、const与宏的区别(面试题)...
  • iOS 了解static与extern

    2019-04-24 08:59:14
    static与extern这类基础知识点,面试时候的老生常谈,牢牢掌握基础才能站得更高。 勤勤恳恳踏踏实实才能走得更远 Static修饰局部变量: 当static关键字修饰局部变量时,只会初始化一次。 例 1: @...
  • A类中 a.m这样定义了一个a类的全局变量 #import "a.h" NSString* hello=@"helloworld"; @implementation a // NSString* hello=@"helloworld"; ...两个地方都行,反正就是定义了这么一个类的全局外部可访问的...
  • iOS 开发导入c++ 文件 使用extern "C" __declspec(dllimport) 导致 unknown type name "__declspec" 字节方法,删除这个部分,ios不需要这个部分
1 2 3 4 5 ... 20
收藏数 9,470
精华内容 3,788
关键字:

extern什么意思 ios