久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

IOS開發之路--C語言預處理

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

概述

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

宏定義 條件編譯 文件包含

宏定義

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


//
// 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 //在另一個宏里面引用了上面的宏

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");//注意輸出結果不是3.14=3.14而是PI=3.14,字符串中的PI并不會被替換
#undef PI //強制終止宏定義,否則它的范圍一直到文件結束
  int PI=3.1415926;
  double area2=PI*r*r;
  printf("area2=%.2f\n",area2);
  
  
  return 0;
}

宏定義實際的操作就是在預處理時進行對應替換,這個階段不管語法是否正確,而且對于字符串中出現的宏名不會進行替換。宏定義的功能事實上是非常強大的,除了簡單的常量替換還可以傳入參數:


//
// 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) //這么定義是錯誤的,預處理器會認為宏名為”MUL“,替換內容為”(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); //結果:c=5
  d=SUM(a, b)*2;
  printf("d=%d\n"); //結果:8,為什么不是10呢?因為替換后:d=a+b*2也就是2+3*2=8
  
  int e=SUB(b, a)*2;
  printf("(b-a)*2=%d\n",e); //結果:2,如果SUB定義時不加括號這里應該是-1
  
  return 0;
}

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

條件編譯

條件編譯其實就是在編譯之前預處理器根據預處理指令判斷對應的條件,如果條件滿足就將對應的代碼編譯進去,否則代碼就根本不進入編譯環節(相當于根本就沒有這段代碼)。


//
// 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) //等價于:#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在前面也多次使用過,這里再次強調一下。首先使用#include“xxx”包含和使用#include <xxx>包含的不同之處就是使用<>包含時,預處理器會搜索C函數庫頭文件路徑下的文件,而使用“”包含時首先搜索程序所在目錄,其次搜索系統Path定義目錄,如果還是找不到才會搜索C函數庫頭文件所在目錄。

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

上面有三段代碼,在main.c和person.h中都包含了message.h而main.c自身又包含了person.h,這樣程序在預處理階段會對包含內容進行替換,替換后mian.c中包含了兩個#include “message.h”雖然沒有報錯,但這會影響編譯的性能,正確的做法應該是這樣的:

其實就是用宏定義判斷一個宏是否定義了,如果沒有定義則會定義這個宏,這樣以來如果已經包含過則這個宏定義肯定已經定義過了,即使再包含也不會重新定義了,下面的代碼也就不會包含進去。

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

相關文檔推薦

這篇文章主要介紹了ios實現文件對比的方法,主要是用到了filemanager,有需要的小伙伴可以參考下。
這篇文章主要給大家匯總了一下ios下移動文件方法,從簡單到復雜,十分的實用,有需要的小伙伴可以參考下。
本文給大家總結了幾則在IOS系統下刪除文件的代碼,十分的實用,有需要的小伙伴可以參考下。
本文給大家分享的是IOS開發中遇到的一個手風琴特效無法正常工作的問題的解決方法,經過度娘了很久才找到解決方法,這里推薦給大家,有需要的小伙伴可以參考下。
這篇文章主要介紹了iOS、Mac OS X系統中編程實現漢字轉拼音的方法(超級簡單),本文講解的方法不僅支持中文,還支持日文、韓文等,需要的朋友可以參考下
這篇文章主要分享了iOS7 毛玻璃特效代碼,非常的實用,做IOS開發的童鞋們不要錯過了
主站蜘蛛池模板: 欧美一区二区三区视频 | 香蕉久久久久久 | 日本精品久久久久 | 午夜精品视频在线观看 | 久久av一区 | 精品国产一区二区三区免费 | 精品久久久久久久久亚洲 | 国产成人精品一区二区三区 | 日韩精品一区二区三区视频播放 | 欧美一区二区在线观看视频 | 殴美成人在线视频 | 欧美午夜精品久久久久久浪潮 | 久久精品色欧美aⅴ一区二区 | 999视频 | 精品国产伦一区二区三区观看说明 | 中文字幕精 | 精品在线播放 | 国产精品爱久久久久久久 | 午夜视频在线 | 国产xxxx搡xxxxx搡麻豆 | 91高清在线视频 | 日韩一区二区三区av | 麻豆久久久久久久 | 亚洲一区二区三区四区五区午夜 | 欧美一区日韩一区 | 亚洲网址| 国产精品99久久久久久大便 | 日韩一区二区成人 | 久久精品小视频 | 久久国产精品久久国产精品 | 爱高潮www亚洲精品 中文字幕免费视频 | h视频免费在线观看 | 久久久免费毛片 | 另类a v| 国产99久久精品一区二区永久免费 | 日韩高清一区二区 | 中文字幕一区二区三区在线观看 | 久久久久久久久国产精品 | 欧美日韩亚| 精品一区国产 | 亚洲精品短视频 |