zoukankan      html  css  js  c++  java
  • IOS UIKIT_EXTERN, __attribute__((visibility ("default"))) 是啥玩意?

    问题提出

    在学习IOS时候,碰到一个函数NSStringFromCGPoint (UIGeometry.h)

    其原型是 UIKIT_EXTERN NSString *NSStringFromCGPoint(CGPoint point);

    原型分析

    NSString* , CGPoint好理解, 前者是库自带的字符串类型, 后者是一个表示2维平面上的点的结构体。但是UIKIT_EXTERN是什么呢?
    查找发现

    UIKitDefines.h

    1 #ifdef __cplusplus
    2 #define UIKIT_EXTERN        extern "C" __attribute__((visibility ("default")))
    3 #else
    4 #define UIKIT_EXTERN            extern __attribute__((visibility ("default")))
    5 #endif
    6 
    7 #define UIKIT_STATIC_INLINE    static inline

    下面一行一行来看

    line1: #ifdef __cplusplus, 说的是如果定义了 __cplusplus宏标识符, 则定义后面的内容(line2), 否则定义#else里面的内容(line4)

    line2: #define UIKIT_EXTERN    extern "C" __attribute__((visibility ("default"))),

    1. extern "C"是为了兼容以前的 C程序, 告诉编译器按照以前C编译方式对(全局)函数或变量进行编译, 否则按照c++方式进行编译[1]

    eg. C方式编译函数extern void fx(int , int), 不对函数名进行特殊处理编译后函数名为_fx(.obj文件中)

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

    2. __attribute__ 是设置函数属性(或者变量属性, 类型属性), 可以设置的属性包括

     1 packed,cleanup, common,nocommon,deprecated,mode,section,shared,tls_model,transparent_union[2]

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

    3. 但是如果设置了__attribute__((visibility ("default")))的函数, 其public属性仍能对外可见, 而不是hidden。可见编译指令 -fvisibility是对所有属性符号进行处理, 而__attribute__((visibility ("default")))是对特定函数可见性进行设置, 避免冲突[3]。

    line3~6:忽略

    line7:#define UIKIT_STATIC_INLINE    static inline, 静态内联

    static 关键字修饰函数表示这是一个本地函数, 不能被没有保护该文件(对该文件具有可见性的其他文件)引用、链接,编译阶段就能强制检查

    inline 关键字表示建议编译器将该函数作为一个内联函数,将函数内的代码直接嵌入到每一个引用处,有点类似于宏定义直接替换,但是却包含了编译器严格的类型检查,所以比宏定义安全,却又有同样的执行速度。

    总结

    UIKIT_EXTERN简单来说,就是将函数修饰为兼容以往C编译方式的、具有extern属性(文件外可见性)、public修饰的方法或变量库外仍可见的属性

    参考

    [1] http://www.cnblogs.com/rollenholt/archive/2012/03/20/2409046.html
    [2] http://blog.csdn.net/juana1/article/details/6849120
    [3] http://blog.csdn.net/mrguanlingyu/article/details/23337885
    
  • 相关阅读:
    网络兼职轻松赚
    微信H5支付demo
    支付宝H5支付demo
    笔记本安装SSD固态硬盘详细的优化设置
    JQuery的AJAX
    第二次面试
    存储过程的总结
    SQl数据操作和查询
    面对考试毫无畏惧的SSH
    掷骰子-IOS新手项目练习(抱歉,由于个人原因,图片没显示,要源码的项目私聊)
  • 原文地址:https://www.cnblogs.com/fortunely/p/4681635.html
Copyright © 2011-2022 走看看