• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

浅谈Objective-C编译器指令

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

下载Xcode后,使用Max OS X Cocoa Application 模板创建一个新项目之后,就会得到一个如图所示的项目。可能需要打开其中的某些组(记住文件夹图标表示Xcode中的一个组,而不是磁盘上的一个文件夹)但基本界面与下图类似。在开发过程中,一些文件可能被重命名或者被其他文件所取代,但整个结构将保持不变。

 

Products组可能会以红色显示应用。红色的文件名表明文件缺失,在构建项目之后,应用文件会变回黑色,表明这个文件现在已经在磁盘上。

警告 :跟踪缺失的文件

当其他文件一个显示红色时是一个警告信息,若使用一个模板创建一个新的项目,并且除产品之外的其他文件缺失,那么这表明一定出了某种错误,需要退出Xcode,删除项目,然后重新创建项目。

项目会包括这种各样的文件,文件的扩展名,表明了文件的类型~

Plist文件是属性列表文件,这些XML文件包含一个存储键/值,plist文件被广泛应用于存储应用的设置信息,通过修改项目设置可以间接更新这些文件,如上图

预编译头文件(.pch)能够包含prefix头,这些prefix头回自动被包含进每个文件的编译结果中。与plist一样,通过项目中的相关界面可以更新这些文件,但需要修改默认设置的情况很少。.pch文件包含了编译器指令,这是很重要的内容。

C语言(以及其他语言中),.h文件通常作头文件,它们在ObjectiveC中也充当着同样的角色。ObjectiveC是基于消息的,实现消息指令的文件(即包含头文件的实现代码的文件)的扩展名为.m

 

使用编译器指令

新建的项目中的文件都是比较小的,因此很容易就能掌握其结构和内容,所有这些文件都使用了编译器指令,因此以这些文件作为切入点来分析编译器指令时一个明智的决定。

编译器指令时编译器在编译文件之前,执行的一组指令,因此它们有些时候也被成为预处理指令或者预处理命令。

1.使用基本指令

本文主要介绍的是很多指令的基础构建模块是定义指令:#define

宏定义最简单的形式是定义一个字符串替换,如:

#define pi 3.14159265

允许编写下面这样的代码。

X= pi * 2

在开始编译之前,这行代码会转换为

X=3.14159265 * 2

另一种形式的宏定义允许定义一个类函数的宏,宏中可以包含一个或多个值,在代码中调用宏时可以提供相应的值。

尽管宏定义是一种处理硬编码诸如pi之类的常量的便捷方式,但他们还可以用于指示是否存在特定的功能。当宏定义用于检测某项功能是否存在时,我们所关注的就只有特定标识符是否被定义成了宏。因此一下代码

#def pi

仅仅测试pi是否被定义成了一个宏,它不会输出任何值。当作宏为标记使用时通常会根据一些标志符,是否被定义过来选择处理或不处理一段代码。

2.Prefix头初探

  现在可以查看prefix头了,程序清单,给出了,创建简单的Mac应用时自动生成的.pch文件

//
//prefix header for all source flies of the 'Simple Mac App'
//target in the 'Simple Mac App' project
//
#ifdef _OBJC_
#import <Cocoa/Cocoa.h>
#endif


上述代码检测_OBJC_是否被定义了。标识符前面和后面的双下划线,是一种命名规则,表明这是一个内部的值。在本例中,ObjectiveC环境中定义_OBJC_.如果该标志符是已定义的话,将会引入Cocoa框架,这就涉及了另一个指令:#import

//
//prefix header for all source flies of the 'Simple ios App'
//target in the 'Simple ios App' project
//
#import <availability.h>
 
#ifndef _IPHONE_3_0
#warning "This project uses features only available in iOS SDK
3.0 and later."
#endif
#ifdef_OBJC_
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#endif

C中一个常见的指令是#include,它用来在编译时将一个外部文件包含进待编译文件,就好像该外部文件是待编译文件的一部分。#include指令存在一个问题是很容易造成循环引用从而会造成代码(特别是声明)被避免上述问题,如果一个文件已经被引入了,那么第二个,#import指令不会起作用。

ObjectiveC编译器在编译程序清单中的代码中将Cocoa框架的Cocoa.h文件引入进来。<>表示该文件是来自框架的——本例是Cocoa框架。

简单程序清单Ios应用的Prefix



这个prefix头首先会无条件的引入一个文件,然后没有像前面的的例子那样检测是否定义了标志符_OBJC_,相反,它检测是否未定义某些标识符。在ios3.0SDK中会定义_IPHONE_3_0。如果标识符为被定义,那么在预处理过程中会生成一个警告信息。在检测完版本之后,它与前面的例子一样是检测是否处于ObjectiveC环境中,在本例中如果处于ObjecttiveC环境中将引入不同的文件。

3.main.m中的普通C代码初探

不管采用MacOS或是iOS模板,使用ObjectiveC编译器可以编译普通的C代码,操作系统将会调用main.h文件中的main函数以启动应用。

4.浅探使用ObjectiveC编译器指令是以@打头,它通常用来描述文件中的内容。如在.h文件中@interface指令用来标示文件的接口代码的起始位置,而@end指令标示该段的结束位置。在.m文件中,@implementation指令用来标示实现的起始位置,@end标志结束位置。@protocolMyprotocol,这些实体会在代码中其他位置定义。

ObjectiveC中字符串使用@进行分隔的,如

@”This is a String”

这里的@符号提醒编译器后面是一个字符串。

小结:

Prefix头的作用是——它们通常包含用来确定哪些代码需要进行编译的宏定义,如果,根据所安装的SDK的版本来进行条件编译。

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
VSCode配置C/C++环境发布时间:2022-07-13
下一篇:
C#获取ListView中选中行中对应的列数据发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap