问题提出

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

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

原型分析

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

UIKitDefines.h

 #ifdef __cplusplus
#define UIKIT_EXTERN extern "C" __attribute__((visibility ("default")))
#else
#define UIKIT_EXTERN extern __attribute__((visibility ("default")))
#endif #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__ 是设置函数属性(或者变量属性, 类型属性), 可以设置的属性包括

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

IOS UIKIT_EXTERN, __attribute__((visibility ("default"))) 是啥玩意?的更多相关文章

  1. [转]GCC系列: __attribute__((visibility("")))

    在 objc-api.h 里面有很多关于__attribute__ 的定义. 例如 #if !defined(OBJC_VISIBLE) # if TARGET_OS_WIN32 # if defin ...

  2. GCC扩展 __attribute__ ((visibility("hidden")))

    试想这样的情景,程序调用某函数A,A函数存在于两个动态链接库liba.so,libb.so中,并且程序执行需要链接这两个库,此时程序调用的A函数到底是来自于a还是b呢? 这取决于链接时的顺序,比如先链 ...

  3. ios项目icon和default图片命名规则

    一.应用图片标准iOS控件里的图片资源,苹果已经做了相应的升级,我们需要操心的是应用自己的图片资源.就像当初为了支持iPhone 4而制作的@2x高分辨率版本(译者:以下简称高分)图片一样,我们要为i ...

  4. iOS.ObjC.__attribute__-directives

    __attribute__ Directives Reference 1. __attribute__ directives in Objective-C (AAAA+) (Read Again) h ...

  5. iOS宏和__attribute__

    本文目录 iOS宏的经典用法 Apple的习惯 __attribute__ iOS宏的经典用法 1.常量宏.表达式宏 #define kTabBarH (49.0f) #define kScreenH ...

  6. __attribute__ ((default)) 和 __attribute__ ((hidden))

    制作一个共享库 /* a.h */ int func(); /* a.c */ #include <stdio.h> #include "a.h" int func() ...

  7. gcc __attribute__关键字举例之visibility【转】

    转自:https://blog.csdn.net/starstarstone/article/details/7493144?utm_source=tuicool&utm_medium=ref ...

  8. iOS开发之--宏定义与const的区别及使用方法

    宏定义的常见用法: 定义一段代码,或指定字符串抽成宏. const(常量): 当有字符串常量的时候,苹果推荐我们使用const,苹果经常把常用的字符串定义成const 宏定义与const的区别: 编译 ...

  9. iOS 通知名的通用定义方法

    开发当中用到通知,通知的定义必须要有一个字符串标识通知的名字.一般可以直接写一个字符串,在通知创建和监听的时候直接写这个字符串. 但这样做非常不好,随手创建写代码当时很舒服,但是后来维护的时候发现通知 ...

随机推荐

  1. Babel的安装和使用

    安装Node.JS 和 npm,如未安装可参照其他文章 1.创建一个package.json npm init (回车, 一直下一步即可) 安装 Babel npm install --save-de ...

  2. 大数据篇:YARN

    YARN YARN是什么? YARN是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率.资源统一管理和数据共享等方面带来了巨大 ...

  3. 设计模式课程 设计模式精讲 5-2 工厂方法coding

    1 课堂讲义 1.1 产品等级和产品簇 2 代码演练 2.1 工厂方法代码演练 1 课堂讲义 1.1 产品等级和产品簇 工厂方法是为了解决同一产品等级的业务抽象问题 抽象工厂方法是为了解决同一产品簇的 ...

  4. 在javaweb中对于session的使用

    1.初次调用session时: String username="student"; HttpSession session=request.getSession(true);// ...

  5. vue element 时间选择器设置禁用日期

    在 el-date-picker 组件中有一个 picker-options 属性 disabledDate 可以设置日期的可选范围 <el-date-picker v-model=" ...

  6. Java通过反射实现实例化

    public static void main(String[] args) throws Exception { User user= (User) test(User.class); System ...

  7. A股上市公司财报披露时间

    一.上市公司年报披露时间:每年1月1日——4月30日. 二.上市公司中年报披露时间:每年7月1日——8月30日. 三.上市公司季报披露时间: 1季报:每年4月1日——4月30日. 2季报(中报):每年 ...

  8. 第1节 Scala基础语法:scala中的方法源码分析

    val list=List(1,2,3,4) list.reduce((x:Int,y:Int)=>x+y)--->list.reduceLeft((x:Int,y:Int)=>x+ ...

  9. Android游戏开发学习(5)--实现Button悬浮于与SurfaceView之上

    原文:http://daikainan.iteye.com/blog/1407355 实现Button悬浮于与SurfaceView之上实现 先看效果: 注意:你实现的SurfaceView和andr ...

  10. node.js的C++入门

    最近的任务是把计划库的API用JavaScript语言调用起来,需要用Node.js的C++扩展,本文简单归总一下node.js addons官方文档https://nodejs.org/api/ad ...