pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

IOS開發(fā)之路--C語(yǔ)言預(yù)處理

由于預(yù)處理指令是在編譯之前就進(jìn)行了,因此很多時(shí)候它要比在程序運(yùn)行時(shí)進(jìn)行操作效率高。在C語(yǔ)言中包括三類預(yù)處理指令,今天將一一介紹:宏定義、條件編譯、文件包含

概述

大家都知道一個(gè)C程序的運(yùn)行包括編譯和鏈接兩個(gè)階段,其實(shí)在編譯之前預(yù)處理器首先要進(jìn)行預(yù)處理操作,將處理完產(chǎn)生的一個(gè)新的源文件進(jìn)行編譯。由于預(yù)處理指令是在編譯之前就進(jìn)行了,因此很多時(shí)候它要比在程序運(yùn)行時(shí)進(jìn)行操作效率高。在C語(yǔ)言中包括三類預(yù)處理指令,今天將一一介紹:

宏定義 條件編譯 文件包含

宏定義

對(duì)于程序中經(jīng)常用到的一些常量或者簡(jiǎn)短的函數(shù)我們通常使用宏定義來處理,這樣做的好處是對(duì)于程序中所有的配置我們可以統(tǒng)一在宏定義中進(jìn)行管理,而且由于宏定義是在程序編譯之前進(jìn)行替換相比定義成全局變量或函數(shù)效率更高。


//
// main.c
// Pretreatment
//
// Created by Kenshin Cui on 14-6-28.
// Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

#include <stdio.h>
#define PI 3.14 //宏定義一般大寫
#define R 10
#define S 2*PI*R //在另一個(gè)宏里面引用了上面的宏

int main(int argc, const char * argv[]) {
  float r=10.5;
  double area=PI*r*r;
  printf("area=%.2f\n",area);
  
  double a=S;
  printf("a=%.2f\n",a);
  printf("PI=3.14\n");//注意輸出結(jié)果不是3.14=3.14而是PI=3.14,字符串中的PI并不會(huì)被替換
#undef PI //強(qiáng)制終止宏定義,否則它的范圍一直到文件結(jié)束
  int PI=3.1415926;
  double area2=PI*r*r;
  printf("area2=%.2f\n",area2);
  
  
  return 0;
}

宏定義實(shí)際的操作就是在預(yù)處理時(shí)進(jìn)行對(duì)應(yīng)替換,這個(gè)階段不管語(yǔ)法是否正確,而且對(duì)于字符串中出現(xiàn)的宏名不會(huì)進(jìn)行替換。宏定義的功能事實(shí)上是非常強(qiáng)大的,除了簡(jiǎn)單的常量替換還可以傳入?yún)?shù):


//
// 1.2.c
// Pretreatment
//
// Created by Kenshin Cui on 14-7-17.
// Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

#include <stdio.h>
#define SUM(a,b) a+b
#define SUB(a,b) (a-b)
#define MUL (a,b) (a*b) //這么定義是錯(cuò)誤的,預(yù)處理器會(huì)認(rèn)為宏名為”MUL“,替換內(nèi)容為”(a,b) (a*b)“


int main(int argc, const char * argv[]) {
  
  int a=2,b=3,c,d;
  c=SUM(a, b);
  printf("c=%d\n",c); //結(jié)果:c=5
  d=SUM(a, b)*2;
  printf("d=%d\n"); //結(jié)果:8,為什么不是10呢?因?yàn)樘鎿Q后:d=a+b*2也就是2+3*2=8
  
  int e=SUB(b, a)*2;
  printf("(b-a)*2=%d\n",e); //結(jié)果:2,如果SUB定義時(shí)不加括號(hào)這里應(yīng)該是-1
  
  return 0;
}

上面我們可以看出帶參數(shù)的宏功能很強(qiáng)大,有點(diǎn)類似于函數(shù),同函數(shù)不同的是它只是簡(jiǎn)單的替換,不涉及存儲(chǔ)空間分配,參數(shù)、返回值等問題,但是由于它在預(yù)處理階段展開,所以一般效率較高。使用帶參數(shù)的宏需要注意的就是結(jié)果最好用括號(hào)括起來否則很容易出現(xiàn)問題(在上面的SUM例子中我們應(yīng)該已經(jīng)看到了);還有一點(diǎn)就是帶參數(shù)的宏定義時(shí)名稱和參數(shù)之間不要有空格。

條件編譯

條件編譯其實(shí)就是在編譯之前預(yù)處理器根據(jù)預(yù)處理指令判斷對(duì)應(yīng)的條件,如果條件滿足就將對(duì)應(yīng)的代碼編譯進(jìn)去,否則代碼就根本不進(jìn)入編譯環(huán)節(jié)(相當(dāng)于根本就沒有這段代碼)。


//
// main.c
// Pretreatment
//
// Created by Kenshin Cui on 14-06-28.
// Copyright (c) 2014年 Kenshin Cui. All rights reserved.
//

#include <stdio.h>
#define COUNT 1

int main(int argc, const char * argv[]) {
  
//判斷是否定義了 COUNT 宏
#if defined(COUNT) //等價(jià)于:#ifdef COUNT,相反如果判斷沒有定義過則可以通過#if !defined(COUNT)或者#ifndef COUNT
  printf("COUNT defined\n");
#endif
  
//判斷宏定義COUNT是否都與1
#if COUNT==1
  showMessage("hello,world!\n");
#else
  say();
#endif
  
  return 0;
}

文件包含

文件包含指令#include在前面也多次使用過,這里再次強(qiáng)調(diào)一下。首先使用#include“xxx”包含和使用#include <xxx>包含的不同之處就是使用<>包含時(shí),預(yù)處理器會(huì)搜索C函數(shù)庫(kù)頭文件路徑下的文件,而使用“”包含時(shí)首先搜索程序所在目錄,其次搜索系統(tǒng)Path定義目錄,如果還是找不到才會(huì)搜索C函數(shù)庫(kù)頭文件所在目錄。

另外在使用#include的時(shí)候我們需要注意包含文件的時(shí)候是不能遞歸包含的,例如a.h文件包含b.h,而b.h就不能再包含a.h了;還有就是重復(fù)包含雖然是允許的但是這會(huì)降低編譯性能,不妨看一下下面的例子:

上面有三段代碼,在main.c和person.h中都包含了message.h而main.c自身又包含了person.h,這樣程序在預(yù)處理階段會(huì)對(duì)包含內(nèi)容進(jìn)行替換,替換后mian.c中包含了兩個(gè)#include “message.h”雖然沒有報(bào)錯(cuò),但這會(huì)影響編譯的性能,正確的做法應(yīng)該是這樣的:

其實(shí)就是用宏定義判斷一個(gè)宏是否定義了,如果沒有定義則會(huì)定義這個(gè)宏,這樣以來如果已經(jīng)包含過則這個(gè)宏定義肯定已經(jīng)定義過了,即使再包含也不會(huì)重新定義了,下面的代碼也就不會(huì)包含進(jìn)去。

【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請(qǐng)聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

這篇文章主要介紹了ios實(shí)現(xiàn)文件對(duì)比的方法,主要是用到了filemanager,有需要的小伙伴可以參考下。
這篇文章主要給大家匯總了一下ios下移動(dòng)文件方法,從簡(jiǎn)單到復(fù)雜,十分的實(shí)用,有需要的小伙伴可以參考下。
本文給大家總結(jié)了幾則在IOS系統(tǒng)下刪除文件的代碼,十分的實(shí)用,有需要的小伙伴可以參考下。
本文給大家分享的是IOS開發(fā)中遇到的一個(gè)手風(fēng)琴特效無法正常工作的問題的解決方法,經(jīng)過度娘了很久才找到解決方法,這里推薦給大家,有需要的小伙伴可以參考下。
這篇文章主要介紹了iOS、Mac OS X系統(tǒng)中編程實(shí)現(xiàn)漢字轉(zhuǎn)拼音的方法(超級(jí)簡(jiǎn)單),本文講解的方法不僅支持中文,還支持日文、韓文等,需要的朋友可以參考下
這篇文章主要分享了iOS7 毛玻璃特效代碼,非常的實(shí)用,做IOS開發(fā)的童鞋們不要錯(cuò)過了
主站蜘蛛池模板: 上海小程序开发-上海小程序制作公司-上海网站建设-公众号开发运营-软件外包公司-咏熠科技 | 硬质合金模具_硬质合金非标定制_硬面加工「生产厂家」-西迪技术股份有限公司 | 宿松新闻网 宿松网|宿松在线|宿松门户|安徽宿松(直管县)|宿松新闻综合网站|宿松官方新闻发布 | 留学生辅导网-在线课程论文辅导-留学生挂科申诉机构 | 热熔胶网膜|pes热熔网膜价格|eva热熔胶膜|热熔胶膜|tpu热熔胶膜厂家-苏州惠洋胶粘制品有限公司 | 冻干机(冷冻干燥机)_小型|实验型|食品真空冷冻干燥机-松源 | 齿轮减速机_齿轮减速电机-VEMT蜗轮蜗杆减速机马达生产厂家瓦玛特传动瑞环机电 | 冷却塔减速机器_冷却塔皮带箱维修厂家_凉水塔风机电机更换-广东康明冷却塔厂家 | 建筑资质代办-建筑资质转让找上海国信启航 | X光检测仪_食品金属异物检测机_X射线检测设备_微现检测 | 商用绞肉机-熟肉切片机-冻肉切丁机-猪肉开条机 - 广州市正盈机械设备有限公司 | 真空泵厂家_真空泵机组_水环泵_旋片泵_罗茨泵_耐腐蚀防爆_中德制泵 | 可程式恒温恒湿试验箱|恒温恒湿箱|恒温恒湿试验箱|恒温恒湿老化试验箱|高低温试验箱价格报价-广东德瑞检测设备有限公司 | 机械立体车库租赁_立体停车设备出租_智能停车场厂家_春华起重 | 光泽度计_测量显微镜_苏州压力仪_苏州扭力板手维修-苏州日升精密仪器有限公司 | 户外健身路径_小区健身器材_室外健身器材厂家_价格-浩然体育 | 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 滚塑PE壳体-PE塑料浮球-警示PE浮筒-宁波君益塑业有限公司 | 砖机托板价格|免烧砖托板|空心砖托板厂家_山东宏升砖机托板厂 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 德国GMN轴承,GMN角接触球轴承,GMN单向轴承,GMN油封,GMN非接触式密封 | 阻燃剂-氢氧化镁-氢氧化铝-沥青阻燃剂-合肥皖燃新材料 | 东莞压铸厂_精密压铸_锌合金压铸_铝合金压铸_压铸件加工_东莞祥宇金属制品 | 高压互感器,电流互感器,电压互感器-上海鄂互电气科技有限公司 | PAS糖原染色-CBA流式多因子-明胶酶谱MMP-上海研谨生物科技有限公司 | 机器视觉检测系统-视觉检测系统-机器视觉系统-ccd检测系统-视觉控制器-视控一体机 -海克易邦 | 厦门ISO认证|厦门ISO9001认证|厦门ISO14001认证|厦门ISO45001认证-艾索咨询专注ISO认证行业 | 佛山商标注册_商标注册代理|专利注册申请_商标注册公司_鸿邦知识产权 | 华夏医界网_民营医疗产业信息平台_民营医院营销管理培训 | 柔性输送线|柔性链板|齿形链-上海赫勒输送设备有限公司首页[输送机] | 除尘器布袋骨架,除尘器滤袋,除尘器骨架,电磁脉冲阀膜片,卸灰阀,螺旋输送机-泊头市天润环保机械设备有限公司 | 上海三信|ph计|酸度计|电导率仪-艾科仪器 | 扬尘监测_扬尘监测系统_带证扬尘监测设备 - 郑州港迪科技有限公司 | 地图标注-手机导航电子地图如何标注-房地产商场地图标记【DiTuBiaoZhu.net】 | 散热器-电子散热器-型材散热器-电源散热片-镇江新区宏图电子散热片厂家 | 全自动实验室洗瓶机,移液管|培养皿|进样瓶清洗机,清洗剂-广州摩特伟希尔机械设备有限责任公司 | PTFE接头|聚四氟乙烯螺丝|阀门|薄膜|消解罐|聚四氟乙烯球-嘉兴市方圆氟塑制品有限公司 | 钢骨架轻型板_膨石轻型板_钢骨架轻型板价格_恒道新材料 | 聚丙烯酰胺PAM-聚合氯化铝PAC-絮凝剂-河南博旭环保科技有限公司 巨野电机维修-水泵维修-巨野县飞宇机电维修有限公司 | 焊接减速机箱体,减速机箱体加工-淄博博山泽坤机械厂 | 天坛家具官网 |