picf509c语言程序,樊媛媛c语言程序设计09编译预处理.pptx
樊媛媛c語(yǔ)言程序設(shè)計(jì)09編譯預(yù)處理
9.1 宏定義 1、不帶參的宏定義用一個(gè)指定的標(biāo)識(shí)符(宏名)代表一個(gè)字符串。一般形式:#define 標(biāo)識(shí)符 字符串如:#define PI 3.1415926有了這一宏定義后,程序中凡是用到3.1425926的地方都可以以宏名PI出現(xiàn)。 牛牛文庫(kù)文檔分享 例:定義一個(gè)宏名來(lái)代表一個(gè)參數(shù)。eg9-01.c#define PI 3.1415926main(){ float r=1.0,c,s; c=2*PI*r; s=PI*r*r; ┈}系統(tǒng)在對(duì)程序進(jìn)行編譯以前,首先將所有的編譯預(yù)處理指令進(jìn)行預(yù)處理,對(duì)本例來(lái)說(shuō),就是將程序中所有的宏名PI還原成3.1415926,——宏展開(kāi)。 牛牛文庫(kù)文檔分享例:定義一個(gè)宏名來(lái)代表一個(gè)數(shù)據(jù)個(gè)數(shù)。eg9-02.c#define N 100main(){ int a[N],i; float s=0; for(i=0;i 牛牛文庫(kù)文檔分享file1.cfile1.cfile2.c#include “file2.c”BBAA 牛牛文庫(kù)文檔分享例:#include “math.h”main(){ float a,b,c,s,area; scanf(“%f%f%f”,&a,&,&c); s=0.5*(a+b+c); area=sqrt(s*(s-a)*(s-b)*(s-c)); printf(“\n %f”,area); } 牛牛文庫(kù)文檔分享f.cf.h#include “f.h”main(){printf(“\n%f”,f1(3.0));printf(“\n %f”,fac(10));}float f1(float r){return(PI*r*r);}float fac(int n){ int i; float s=1;for(i=1;i<=n;i++) s*=i;return(s);}#define PI 3.1415926float f1(float r);float fac(int n); 牛牛文庫(kù)文檔分享2*3+5=112*(3+5)=16函數(shù)式宏定義與普通函數(shù) 在C及C++語(yǔ)言中允許用一個(gè)標(biāo)識(shí)符來(lái)表示一個(gè)字符串,稱為宏,該字符串可以是常數(shù)、表達(dá)式、格式串等。在編譯預(yù)處理時(shí),對(duì)程序中所有出現(xiàn)的“宏名”,都用宏定義中的字符串去代換,這稱為“宏代換”或“宏展開(kāi)”。宏定義是由源程序中的宏定義命令完成的。宏代換是由預(yù)處理程序自動(dòng)完成的。若字符串是表達(dá)式,我們稱之為函數(shù)式宏定義,那函數(shù)式宏定義與普通函數(shù)有什么區(qū)別呢?我們以下面兩行代碼為例,展開(kāi)描述: 函數(shù)式宏定義:#define MAX(a,b) ((a)>(b)?(a):(b)) 普通函數(shù)?????:?MAX(a,b) { return a>b?a:b;}(1)函數(shù)式宏定義的參數(shù)沒(méi)有類型,預(yù)處理器只負(fù)責(zé)做形式上的替換,而不做參數(shù)類型檢查,所以傳參時(shí)要格外小心。(2)調(diào)用真正函數(shù)的代碼和調(diào)用函數(shù)式宏定義的代碼編譯生成的指令不同?!∪绻鸐AX是個(gè)普通函數(shù),那么它的函數(shù)體return a > b ? a : b; 要編譯生成指令,代碼中出現(xiàn)的每次調(diào)用也要編譯生成傳參指令和call指令。而如果MAX是個(gè)函數(shù)式宏定義,這個(gè)宏定義本身倒不必編譯生成指令,但是代碼中出現(xiàn)的每次
總結(jié)
以上是生活随笔為你收集整理的picf509c语言程序,樊媛媛c语言程序设计09编译预处理.pptx的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: tftp的c语言实现,GitHub -
- 下一篇: android自定义dialog开源库,