文档章节

Objective-C 中的 __attribute__

q
 qqzhao2010
发布于 2015/12/17 18:38
字数 931
阅读 28
收藏 0
点赞 0
评论 0

1. GCC应用

GNU C 的一大特色就是__attribute__ 机制。attribute 可以设置函数属性(Function Attribute )变量属性(Variable Attribute )类型属性(Type Attribute )

attribute 书写特征是:attribute 前后都有两个下划线,并切后面会紧跟一对原括弧,括弧里面是相应的__attribute__ 参数。

attribute 语法格式为:__attribute__ ((attribute-list))

其位置约束为:放于声明的尾部;之前。

1.1 函数属性举例

使用warn_unused_result :表示需要使用函数的返回值,否则会产生一个警告。

- (BOOL)testFunc:(NSInteger) num __attribute__ ((warn_unused_result));
- (BOOL)testFunc2:(NSInteger) num ;

[object testFunc:1];//have a warning
[object testFunc2:1];

BOOL result = [object testFunc:1];
NSLog(@"%d",result);

其他函数举例

  • noreturn : 表示忽略函数没有返回值的警告,异常退出时使用。
  • format : 可以给被声明的函数加上类似printf或者scanf的特征,它可以使编译器检查函数声明和函数实际调用参数之间的格式化字符串是否匹配。该功能十分有用,尤其是处理一些很难发现的bug。
  • const : 是编译优化,编译器只调用了函数一次,以后只是直接得到了相同的一个返回值。

1.2 变量属性

还没有找到合适的变量属性举例。

1.3 类型属性

aligned (alignment) : 该属性设定一个指定大小的对齐格式(以字节为单位)

struct AttributeMarkS {
    short b[3];
} __attribute__ ((aligned (8)));


struct AttributeMarkS2 {
    short b[3];
};

struct AttributeMarkS aa;
struct AttributeMarkS2 bb;
NSLog(@"aa:%ld,bb:%ld",sizeof(aa),sizeof(bb));//aa:8,bb:6

packed : 使用该属性对struct 或者union 类型进行定义,设定其类型的每一个变量的内存约束。aligned 属性使被设置的对象占用更多的空间,相反的,使用packed 可以减小对象占用的空间。

2. LLVM应用

Clang支持__attribute__,是否支持特定的,可以用__has_attribute进行检查。如下:

#if __has_attribute(const_test)
    NSLog(@"have attribute const_test");
#else
    NSLog(@"no attribute const_test");//const_test
#endif

availability

主要作用进行版本可用性声明,如下:

void f(void) __attribute__((availability(macosx,introduced=10.4,deprecated=10.6,obsoleted=10.7)));

  • introduced: 声明第一次被引入的版本.
  • deprecated: 声明不推荐的版本,即从这个版本开始,这个函数不再推荐使用
  • obsoleted: 声明被弃用的版本,即从此版本开始,这个函数被弃用了,但是仍然可用。
  • unavailable: 声明不可用.
  • message 当碰到警告或者错误的时候弹出的消息提示.

文章中是Swift2.0中关于函数可用性的设置,可以进行类比。

overloadable

作用是进行函数的重载(overloading)。


float __attribute__((overloadable)) tgsin(float x) { return sinf(x); }
double __attribute__((overloadable)) tgsin(double x) { return sin(x); }
long double __attribute__((overloadable)) tgsin(long double x) { return sinl(x); }

float  tgsin2(float x) { return sinf(x); }
double  tgsin2(double x) { return sin(x); }//error ,conflicting types for 'tgsin2'

3. Objective-C库中的包装

查看Objective-C函数库文件中使用attribute的定义主要在文件 NSObjCRuntime.h 中。文章中曾经介绍的系统NSManagedObject类中,归根结底还是利用了attribute的特性。如下注意 NS_CLASS_AVAILABLENS_REQUIRES_PROPERTY_DEFINITIONS

NS_CLASS_AVAILABLE(10_4,3_0) NS_REQUIRES_PROPERTY_DEFINITIONS
@interface NSManagedObject : NSObject {
@private
    int32_t             _cd_rc;
    uintptr_t           _cd_stateFlags;
    ...
}

#define NS_CLASS_AVAILABLE(_mac, _ios) __attribute__((visibility("default"))) NS_AVAILABLE(_mac, _ios)

#if __has_attribute(objc_requires_property_definitions)
#define NS_REQUIRES_PROPERTY_DEFINITIONS __attribute__((objc_requires_property_definitions)) 
#else
#define NS_REQUIRES_PROPERTY_DEFINITIONS
#endif

文件中还有好多其他的例子,可以详查。另外,文件CFAvailability.h是属性available的封装也可以进行代码分析。

4. 总结

__attribute__ 主要是通过编译预处理的方式来进行编译警告提示和编译优化的工作。了解它,有助于我们更好的进行编码。上面列举的仅仅是部分 attribute-list,还有好多没有列举到,这个工作需要慢慢的进行。

5. 参考文献

http://blog.csdn.net/hello_hwc/article/details/42803645

http://www.cnblogs.com/astwish/p/3460618.html

http://nshipster.com/attribute/

© 著作权归作者所有

共有 人打赏支持
q
粉丝 0
博文 19
码字总数 42625
作品 0
海淀
程序员
关于__has_attribute的使用

在开源代码中我们经常看到如下的代码 #ifndef ASDISPLAYNODEREQUIRESSUPER if hasattribute(objcrequires_super) define ASDISPLAYNODEREQUIRESSUPER attribute((objcrequiressuper)) else d......

petsatan ⋅ 2015/06/06 ⋅ 0

Objective-C Runtime 运行时之二:成员变量与属性

在前面一篇文章中,我们介绍了Runtime中与类和对象相关的内容,从这章开始,我们将讨论类实现细节相关的内容,主要包括类中成员变量,属性,方法,协议与分类的实现。 本章的主要内容将聚集在...

hejunbinlan ⋅ 2016/06/03 ⋅ 0

Swift 3.0 发布,开源后首个主要发行版本

Swift 3.0 是 Swift 宣布开源后的首页主要发行版本,包含众多关于核心语言以及标准库的主要改进和优化,同时包含 Swift 在 Linux 上移植的版本,以及官方首个 Swift Package Manager 版本。 ...

红薯 ⋅ 2016/09/15 ⋅ 20

SonarQube C/C++/Objective-C 4.2 发布

SonarQube C/C++/Objective-C 4.2 发布了,这是一个C/C++/Objective-C的插件,用于检查代码质量。 这个版本提供了以下的新规则: “nonnull” pointers should not be set to null (C, Bug) ...

局长 ⋅ 2016/10/06 ⋅ 0

Objective-C Runtime(四)isa swizzling

Runtime 4 isa swizzling Objective-C Runtime(一) 简介 对象、类的结构 消息传递(Messaging) Objective-C Runtime(二) 动态方法解析和转发 Objective-C Runtime(三) Method Swizzli...

liuyanhongwl ⋅ 03/27 ⋅ 0

记录一下iOS开发中琐碎的点点_1

左侧边缘右滑推出控制器 实际上iOS7之后都是支持这个功能的. 导航控制器默认是支持这个功能的, 但是这个功能有个局限, 当导航控制器包含自定义 时候, 右滑pop的功能就会失效. 有个代理方法:...

hell03W ⋅ 2016/03/16 ⋅ 0

Objective C 的setter赋值函数视频基础提高课程(三)

腾讯视频 Objective C 的setter赋值函数 链接:http://dwz.cn/zH6nM 一、setter和getter的一般写法 setter和getter器可以说是一个类最基本的东西,任何一门面向对象的语言,都又这个概念,C...

马洪伟 ⋅ 2015/01/05 ⋅ 0

iOS学习之Objective-C 2.0 运行时系统编程

1 概述 Objective-C语言将决定尽可能的从编译和链接时推迟到运行时。只要有可能,Objective-C总是使用动态的方式来解决问题。这意味着Objective-C语言不仅需要一个编译器,同时也需要一个运行...

Chars-D ⋅ 2016/02/15 ⋅ 0

Runtime of Objective-C

- (void)forwardInvocation:(NSInvocation *)anInvocation { if ([someOtherObject respondsToSelector:[anInvocation selector]]) [anInvocation invokeWithTarget:someOtherObject]; else ......

Im刘亚芳 ⋅ 2014/12/05 ⋅ 0

iOS开发小结(一):ObjCRuntimeGuide小记

Jason Lee @ 杭州 博客:http://blog.csdn.net/jasonblog 微博:http://weibo.com/jasonmblog 版本和平台 Runtime System对于Objective-C来说就好比是它的操作系统/运行平台,它使得Objecti...

迷途d书童 ⋅ 2012/03/05 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Linux kernel脉络和主干总结

写在前面 前人常说,对Linux操作系统/内核的理解,是计算机行业从业者的内功,决定了你在技术领域想走多远。但内核的庞大以及学习曲线之陡峭,总让我在学习途中觉得犹如“管中窥豹”。 随着工...

Markz0928 ⋅ 25分钟前 ⋅ 0

在gcc中使用intel风格的内联汇编

很简单,内联汇编使用asm(“.intel_syntax noprefix/n”)声明一下,以后的内联汇编就可以用intel风格了,构建可执行文件时给gcc加上-masm=intel参数。 先写一个小程序测试一下: [cpp] view...

simpower ⋅ 35分钟前 ⋅ 0

NIO 之 ByteBuffer实现原理

相关文章 BIO、NIO、AIO 内部原理分析 NIO 之 Selector实现原理 NIO 之 Channel实现原理 前言 Java NIO 主要由下面3部分组成: Buffer Channel Selector 在传统IO中,流是基于字节的方式进行...

轨迹_ ⋅ 44分钟前 ⋅ 0

Jenkins docker权限问题

环境Ubuntu Server 工具 jenkins-war:2.89.2 报错信息 Cannot connect to the Docker daemon. Is the docker daemon running on this host?Build step 'Execute shell' marked build as fai......

Pulsar-V ⋅ 45分钟前 ⋅ 0

180621-一个简单的时间窗口设计与实现

如何设计一个计数的时间窗口 时间窗口,通常对于一些实时信息展示中用得比较多,比如维持一个五分钟的交易明细时间窗口,就需要记录当前时间,到五分钟之前的所有交易明细,而五分钟之前的数...

小灰灰Blog ⋅ 今天 ⋅ 0

Android之Dalvik、ART、JIT、AOT

Android之Dalvik、ART、JIT、AOT 本文内容:Dalvik、ART、JIT、AOT之间关系 本文定位:知识记录 学习过程记录,加深理解,提升文字组合表达能力。也希望能给学习的同学一些灵感 本文整理于[...

lichuangnk ⋅ 今天 ⋅ 0

Thrift RPC实战(五) thrift连接池

Thrift本身没有提供连接池,我们可以用Apache Commons Pool2来实现一个 一、定义对象工厂 BasePooledObjectFactory<T> extends BaseObject implements PooledObjectFactory<T> public class......

lemonLove ⋅ 今天 ⋅ 0

git 命令简写

简写 命令 g git gst git status gd git diff gdc git diff --cached gdv git diff -w "$@" | view - gl git pull gup git pull --rebase gp git push gc git commit -v gc! git commit -v ......

charley158 ⋅ 今天 ⋅ 0

Java中的锁使用与实现

1.Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。 在Lock出现之前,java程序是靠synchronized关键字实现锁功能的,而Java SE5之后,...

ZH-JSON ⋅ 今天 ⋅ 0

Intellij IDEA神器常用技巧四-类和方法注释模板设置

IDEA自带的注释模板不是太好用,我本人到网上搜集了很多资料系统的整理了一下制作了一份比较完整的模板来分享给大家,我不是专业玩博客的,写这篇文章只是为了让大家省事。 这里设置的注释模...

Mkeeper ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部