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ò)過了
主站蜘蛛池模板: 分子蒸馏设备(短程分子蒸馏装置)_上海达丰仪器| CE认证_FCC认证_CCC认证_MFI认证_UN38.3认证-微测检测 CNAS实验室 | 刹车盘机床-刹车盘生产线-龙口亨嘉智能装备 | 拉力测试机|材料拉伸试验机|电子拉力机价格|万能试验机厂家|苏州皖仪实验仪器有限公司 | 喷播机厂家_二手喷播机租赁_水泥浆洒布机-河南青山绿水机电设备有限公司 | SF6环境监测系统-接地环流在线监测装置-瑟恩实业 | 安全阀_弹簧式安全阀_美标安全阀_工业冷冻安全阀厂家-中国·阿司米阀门有限公司 | 滑石粉,滑石粉厂家,超细滑石粉-莱州圣凯滑石有限公司 | 安徽净化工程设计_无尘净化车间工程_合肥净化实验室_安徽创世环境科技有限公司 | 不锈钢散热器,冷却翅片管散热器厂家-无锡市烨晟化工装备科技有限公司 | 扒渣机,铁水扒渣机,钢水扒渣机,铁水捞渣机,钢水捞渣机-烟台盛利达工程技术有限公司 | 拉力测试机|材料拉伸试验机|电子拉力机价格|万能试验机厂家|苏州皖仪实验仪器有限公司 | RFID电子标签厂家-上海尼太普电子有限公司 | 山东风淋室_201/304不锈钢风淋室净化设备厂家-盛之源风淋室厂家 翻斗式矿车|固定式矿车|曲轨侧卸式矿车|梭式矿车|矿车配件-山东卓力矿车生产厂家 | 【孔氏陶粒】建筑回填陶粒-南京/合肥/武汉/郑州/重庆/成都/杭州陶粒厂家 | 模具ERP_模具管理系统_模具mes_模具进度管理_东莞市精纬软件有限公司 | 雷冲击高压发生器-水内冷直流高压发生器-串联谐振分压器-武汉特高压电力科技有限公司 | 全自动在线分板机_铣刀式在线分板机_曲线分板机_PCB分板机-东莞市亿协自动化设备有限公司 | 青岛球场围网,青岛车间隔离网,青岛机器人围栏,青岛水源地围网,青岛围网,青岛隔离栅-青岛晟腾金属制品有限公司 | 在线浊度仪_悬浮物污泥浓度计_超声波泥位计_污泥界面仪_泥水界面仪-无锡蓝拓仪表科技有限公司 | uv机-uv灯-uvled光固化机-生产厂家-蓝盾机电| 西宁装修_西宁装修公司-西宁业之峰装饰-青海业之峰墅级装饰设计公司【官网】 | 北京中创汇安科贸有限公司 | 校服厂家,英伦校服定做工厂,园服生产定制厂商-东莞市艾咪天使校服 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 重庆网站建设,重庆网站设计,重庆网站制作,重庆seo,重庆做网站,重庆seo,重庆公众号运营,重庆小程序开发 | 真丝围巾|真丝丝巾|羊绒围巾|围巾品牌|浙江越缇围巾厂家定制 | 常州企业采购平台_常州MRO采购公司_常州米孚机电设备有限公司 | 除甲醛公司-甲醛检测-广西雅居环境科技有限公司 | 运动木地板厂家,篮球场木地板品牌,体育场馆木地板安装 - 欧氏运动地板 | 真空泵维修保养,普发,阿尔卡特,荏原,卡西亚玛,莱宝,爱德华干式螺杆真空泵维修-东莞比其尔真空机电设备有限公司 | 云阳人才网_云阳招聘网_云阳人才市场_云阳人事人才网_云阳人家招聘网_云阳最新招聘信息 | YJLV22铝芯铠装电缆-MYPTJ矿用高压橡套电缆-天津市电缆总厂 | 元拓建材集团官方网站| 上海办公室装修公司_办公室设计_直营办公装修-羚志悦装 | 潍坊大集网-潍坊信息港-潍坊信息网| 电动百叶窗,开窗器,电动遮阳百叶,电动开窗机生产厂家-徐州鑫友工控科技发展有限公司 | 活性氧化铝球|氧化铝干燥剂|分子筛干燥剂|氢氧化铝粉-淄博同心材料有限公司 | 美的商用净水器_美的直饮机_一级代理经销商_Midea租赁价格-厂家反渗透滤芯-直饮水批发品牌售后 | 农业四情_农业气象站_田间小型气象站_智慧农业气象站-山东风途物联网 | 基本型顶空进样器-全自动热脱附解吸仪价格-AutoHS全模式-成都科林分析技术有限公司 |