美文网首页
UIKIT_EXTERN的基本理解

UIKIT_EXTERN的基本理解

作者: LTOVE | 来源:发表于2018-08-13 17:42 被阅读0次

    查看SDK源文件

    #ifdef __cplusplus
    #define UIKIT_EXTERN        extern "C" __attribute__((visibility ("default")))
    #else
    #define UIKIT_EXTERN            extern __attribute__((visibility ("default")))
    #endif
    

    用途

    一般用于全局变量的定义(objective-c)

    在.h文件中定义全局变量

    #import <UIKit/UIKit.h>
    UIKIT_EXTERN CGFloat const titleSize;
    

    而在.m文件中一般这样定义

    #import <UIKit/UIKit.h>
     CGFloat const titleSize = 25.0;
    

    解释

    1. extern "C"是为了兼容以前的 C程序, 告诉编译器按照以前C编译方式对(全局)函数或变量进行编译, 否则按照c++方式进行编译[1]。
      例如: C方式编译函数extern void fx(int , int), 不对函数名进行特殊处理编译后函数名为_fx(.obj文件中)

    但是C++方式编译后, (为了支持重载)fx函数变成类似于_fx_int_int这样的函数名, fx(int , float)会编译成_fx_int_float (.obj文件)

    1. attribute 是设置函数属性(或者变量属性, 类型属性), 可以设置的属性包括:
      packed,cleanup, common,nocommon,deprecated,mode,section,shared,tls_model,transparent_union

    visibility属性是设置将本项目的函数作为库使用时的可见性。g++编译时, 加入-fvisibility=hidden参数, 会将所有默认public属性设为hidden, 导致库外文件不可见

    1. 但是如果设置了attribute((visibility ("default")))的函数, 其public属性仍能对外可见, 而不是hidden。可见编译指令 -fvisibility是对所有属性符号进行处理, 而attribute((visibility ("default")))是对特定函数可见性进行设置, 避免冲突[3]。
    2. static 关键字修饰函数表示这是一个本地函数, 不能被没有保护该文件(对该文件具有可见性的其他文件)引用、链接,编译阶段就能强制检查
      5. UIKIT_EXTERN简单来说:就是将函数修饰为兼容以往C编译方式的、具有extern属性(文件外可见性)、public修饰的方法或变量库外仍可见的属性

    相关文章

      网友评论

          本文标题:UIKIT_EXTERN的基本理解

          本文链接:https://www.haomeiwen.com/subject/fuwubftx.html