澳门威利斯人_威利斯人娱乐「手机版」

来自 澳门威利斯人 2020-05-09 00:55 的文章
当前位置: 澳门威利斯人 > 澳门威利斯人 > 正文

威尼斯人娱乐:预处理指令,C中的预处理器指令

前两部是机动处理的,第三部要基于预管理语言函数实行拍卖,

C/C 预管理指令#define,#ifdef,#ifndef,#endif…,

正文首要记录了C/C 预管理指令,不感觉奇的预管理指令如下:

理当如此只是想精晓一下#ifdef,#ifndef,#endif的,没悟出查出来这么多的预管理指令,上边的绝大大多都以广阔的,不过平日从未怎么在乎预管理那上头的剧情,所以那边梳理一下学问吧。同一时间有如何不妥的地点,可能疏漏了何等内容,还请留言建议。


怎么是预管理指令?

预管理指令是以#号先河的代码行。#号必得是该行除了任何空白字符外的第多个字符。#后是指令关键字,在关键字和#号之间允许存在猖獗个数的空白字符。整行语句构成了一条预管理指令,该指令将要编写翻译器举行编译此前对源代码做一点转换。

早前从未有过理会的大家注意了,预管理指令是在编写翻译器举办编写翻译早前开展的操作.预管理进程扫描源代码,对其进展初叶的转变,爆发新的源代码提需求编写翻译器。可以看到预管理进度先于编写翻译器对源代码进行拍卖。在不菲编制程序语言中,并从未其余内在的建制来完结如下一些效果与利益:在编写翻译时带有别的源文件、定义宏、依照条件决定编译时是还是不是满含有些代码(幸免再一次包蕴有个别文件卡塔尔国。要成功那个干活儿,就须求采纳预管理程序。就算在这里时此刻大多数编写翻译器都含有了预管理程序,但平时以为它们是独自于编译器的。预管理进度读入源代码,检查富含预管理指令的语句和宏定义,并对源代码举行响应的转移。预管理进程还有大概会删除程序中的注释和剩余的空白字符。


#include包括三个源代码文件

本条预管理指令,笔者想是见得最多的一个,轻便说一下,第一种办法是用尖括号把头文件括起来。这种格式告诉预管理程序在编写翻译器自带的或外界库的头文件中搜索被含有的头文件。第三种办法是用双引号把头文件括起来。这种格式告诉预管理程序在当前被编写翻译的应用程序的源代码文件中查找被含有的头文件,如若找不到,再找找编写翻译器自带的头文件。接纳二种分裂富含格式的理由在于,编译器是安装在公共子目录下的,而被编译的应用程序是在它们自身的私有子目录下的。一个应用程序既蕴含编写翻译器提供的公共头文件,也满含自定义的私有头文件。选用二种区别的蕴藏格式使得编写翻译器能够在相当多头文件中分裂出一组公共的头文件。


#define定义宏

有关#define这一个宏定义,在C语言中运用的超级多,因为#define存在有的欠缺,C 强调应用const来定义常量。宏定义了二个意味一定内容的标记符。预管理进度会把源代码中冒出的宏标记符替换到宏定义时的值。记住仅仅是开展标志符的替换。上边罗列部分#define的使用:

关于#define宏的应用,应该极其小心,特别是含有参数总括的时候如小2演示,最保障的做法将参数用括号括起来。


#ifdef,#ifndef,#endif...的使用

如上这个预编写翻译指令,都以条件编写翻译指令,也正是说,将调节这几个代码被编写翻译,而怎么着不被编写翻译。


小结:

预管理正是在进展编写翻译的率先遍词法扫描和语法解析以前所作的干活。说白了,就是对源文件实行编写翻译前,先对预管理部分实行管理,然后对管理后的代码进行编写翻译。那样做的利润是,经过管理后的代码,将会变的很简单。


参谋资料:中午的阴影

本文首要记录了C/C 预管理指令,不可枚举的预管理指令如下: 本来只是想打听一下#ifdef,#ifndef,#end...

既是有这样多进程,为何要爱惜预微处理器呢?因为它在大家的开支中最分布,何况每一种iOS开采者一定都见过。

预管理语言对源文件举行改变首要富含文件援引、条件编写翻译、宏张开。预管理语言定义了预管理指令和宏定义。预管理指令是预微机推行的一声令下和编写翻译器非亲非故,宏定义只是一个存著名称的一段代码,在文书中会被预微型机替换来相应代码。

#defind SQUARE x * xint number = SQUARE;// 你以为会等于36?并不会// 我们说了,宏只会简单替换,所以上面等价于:int number = 4   2 * 4   2;// 其实等于14

前些天我们任重先生而道远看看和预微型机相关的剧情。预微型机管理进度主要不外乎多少个步骤:

不相信的话大家得以列举一下普及的预管理指令,预微机有其分别于Objective-C的特有语法,语法情势如下:

头文件引用

头文件引用首要由#inlude#import 三种。种种又分为尖括号(<>卡塔尔(قطر‎引用和双引号(" ")引用 。

  1. #inlude#import 的界别是: #import 不会促成重复引用,它会温和检查是不是早就援用过,也能够堤防递归富含。

import的得以完成是由此#ifndef三个标识举行判别,然后在引进后#define这一个标识,来制止重新援用的。

  1. 尖括号(<>State of Qatar引用与双引号(" "卡塔尔援引的差距是
    • 双引号(" "卡塔尔(قطر‎援用的文书,编写翻译器会率先在存款和储蓄源文件的一模一样目录下搜索,若是文件未有找到编写翻译器会招来默许目录(配置文件中配置的头文件援用目录)。
    • 尖括号(<>卡塔尔援引 只会在暗中同意目录下找出。

主题素材来了,有吗差别?

如上海体育场合所示编译进度大概包含词法解析、语法深入分析、生成代码和优化、汇编链接,最后输出可进行的二进制文件。关于当中每一个阶段的具体行为,大家就不抓好际切磋了,已经高于了小编的力量节制(恨本人那时候大学之间编写翻译原理未有好好学啊),假使您感兴趣能够商量一下“龙书”《Compilers: Principles, Techniques, and Tools》,传说LLVM的作者Chris Lattner 曾经修炼了这本武术法门,还未有结业就被Apple盯上了。龙书形容如下:

#ifdef 宏名// 执行内容#endif#ifndef 宏名// 执行内容#endif
  • 文件翻译: 将输入的源文件分成代码行,并开展部分翻译管理。
  • 标识调换: 将上一步的管理结果转变到旗号语言。
  • 依照预管理语言的改换: 若是上一步结果中带有预管理语言因素,就能开展更动。

如上便是OC编写翻译中的预微机中的一些预管理语言函数的内容,预微电脑的内容自然不单单唯有这几个,还应该有对源文件的有的管理,但那么些是咱们经常开辟中时时境遇的,明白他们是必需且重要的。

Objective-C源文件在编写翻译早先要先通过预编写翻译器管理,然后再扔给LLVM处理、优化。Objectice-C编写翻译器从源文件的输入到编写翻译后的出口文件,管理进程分解后如下图:

预微处理机是在OC源文件编写翻译进度中的一个有的,并且是首先个管理部分,预微处理器的预也总之。

原则编写翻译

规格编写翻译指令首要不外乎 (#if, #elif, #else, #endif, #ifdef, #ifndefState of Qatar利用他们能够选拔性的编写翻译代码。多少个#if或者#ifdef 最后必定将以#endif截至,中间写规范管理依旧插入else指令。比如:

#ifdef DEBUG NSLog (@"File search complete. Found %i files", filecount");#endif

#if constant_expression#else#endif

or

#if constant_expression#elif constant_expression#endif

宏被定义后,会间接留存,何况能在全体文件中起效用,直到被#undef指令移除停止。假如函数有多个参数,用逗号分隔开分离。

威尼斯人娱乐 1123.png

本条命令精通起来有一点复杂,首先line定义了一个行号,那么之后每一行都会有多少个在此基本功上挨门挨户加一的行号,比方下一行的错误代码就是第11行。爆发错误后,会抛出说"文件名"文件的第11行有不当。前边随着的文书名是二个可选拔,写了就能够在音讯中突显,不写也没提到。

原稿链接: , 转发请到原来的小说下留言申请。

// 定义常量值#define 宏名 值//定义函数宏#define 宏名 代码// 移除宏#undef 宏名

宏定义

宏定义正是对代码段起个名字,编写翻译器编写翻译此前预微机会举办简短的字符串替换。宏定义能够张开简易的轮流:

#define MY_CONSTANT 4

也足以定义一个带参数的代码段

#define SQUARE * 

因为宏定义私下认可只扶持同样,如若要定义多行时每行结尾要加贰个斜线(),最后一行不用。

#define SWAP a^=b;b^=a;a^=b;

宏定义枚举Block在`OC中时常应用。宏定义会在编译在此以前开展拍卖,何况一旦定义在其效用范围内都足以引用,能够增加编程作用。宏定义功用强盛,当然宏定义也不可能乱用它也设有鲜明,例如难以维护和查错。真机测量试验时定义太多的宏,当校正三个值就能重复编译好久。提出日常修正的值不要使用宏。一些宏能用常量替换的玩命利用常量。

原来的作品链接: Wechat民众账号同步立异:lecoding下边列出自己自个儿项目中时时利用的宏定义:

//1. 打印日志#ifdef DEBUG# define DLog NSLog(__VA_ARGS__)#else# define DLog#endif//2. 获取屏幕 宽度、高度#define kScreenWidth ([UIScreen mainScreen].bounds.size.width)#define kScreenHeight ([UIScreen mainScreen].bounds.size.height)//3. 颜色#define RGB(r, g, b, a) [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:a]#define HEXCOLOR [UIColor colorWithRed:((c>>16)&0xFF)/255.0f green:((c>>8)&0xFF)/255.0f blue:(c&0xFF)/255.0f alpha:1.0f]//背景色 #define BACKGROUND_COLOR [UIColor colorWithRed:242.0/255.0 green:236.0/255.0 blue:231.0/255.0 alpha:1.0] //清除背景色 #define CLEARCOLOR [UIColor clearColor] //4.加载图片宏:#define LOADIMAGE(file,type) [UIImage imageWithContentsOfFile:[[NSBundle mainBundle]pathForResource:file ofType:type]]//5. NavBar高度#define NavigationBar_HEIGHT 44//6. 获取系统版本#define IOS_VERSION [[[UIDevice currentDevice] systemVersion] floatValue]#define CurrentSystemVersion [[UIDevice currentDevice] systemVersion]//7. 判断是真机还是模拟器#if TARGET_OS_IPHONE //iPhone Device#endif#if TARGET_IPHONE_SIMULATOR //iPhone Simulator#endif//8. 设置View的tag属性#define VIEWWITHTAG(_OBJECT, _TAG) [_OBJECT viewWithTag : _TAG]//9. GCD#define BACK dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), block)#define MAIN dispatch_async(dispatch_get_main_queue//10. NSUserDefaults 实例化#define USER_DEFAULT [NSUserDefaults standardUserDefaults]

原稿链接

本博客也会在 *** lecoding *** 微信大伙儿号中一头立异,款待咱们订阅,有怎么着难题能够在这一并交换。大伙儿号找出:*** 乐Coding *** 或者 *** lecoding *** 可能微信扫描下方二维码:

威尼斯人娱乐 2

除了上述的下令外,还应该有二个老熟人也归属预微处理器的层面,下文再来讲。

威尼斯人娱乐 3234.png

查阅我首页

Pragma指令

pragma 指令之一种编写翻译器指令,它能够在一定平台下采纳,像mark一声令下能够对代码举办分层标识,让代码更便于物色和跳转到钦命地方。 我在团结的Controller中通常如此mark如下:

#pragma mark -#pragma mark Life Cycle#pragma mark -#pragma mark Private Method#pragma mark -#pragma mark Action#pragma mark -#pragma mark Setter&Getter
#pragma mark - UITableView DataSource……#pragma mark - UITableView Delegate……

指令

指令的格式: #指令名 指令参数 例如

#import "Student.h"#define kBackColor [UIColor redColor]

命令首要归纳以下八种:

  • 头文件援用
  • 原则编写翻译
  • 错误诊断
  • Pragma
#ifndef 宏名#error "发生错误啦"#endif#if XXX#warning "警报!警报!"#endif
确诊指令

确诊指令首要归纳 #error#warning

#ifndef ifOpen#error "Not Open"#endif

假诺步入到#error指令,则编写翻译器不会往下实施,假诺编写翻译到#warning一声令下,只会来得二个告诫音信,还恐怕会持续编写翻译。

确诊中先说头五个:

本文由澳门威利斯人发布于澳门威利斯人,转载请注明出处:威尼斯人娱乐:预处理指令,C中的预处理器指令

关键词: 澳门威利斯人 Objective Preprocessor 指令