版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
2024/12/23第7章編譯預處理C/C++語言程序設計案例教程7.1宏定義7.2文件包含7.3條件編譯2024/12/232預處理不是C語言本身的組成部分,不能直接進行編譯。在對源程序編譯之前,系統(tǒng)先將這部分命令進行“預處理”,處理后源程序將不再包括預處理命令,隨后系統(tǒng)完成編譯,鏈接生成目標程序。C語言提供3種預處理功能:宏定義;文件包含;條件編譯。2024/12/233案例一宏的使用1.問題描述計算物體在水中的浮力以及在不同液體和不同物體體積下受到的浮力(假設物體全部沉入水中)。2.問題分析浮力=pgv。在水中,物體受到的浮力與體積有關,g是常數(shù),將g定義為宏(無參宏)。在液體中,不同物體在不同液體中受到的浮力與物體體積和液體的密度有關,將計算公式也定義為宏(有參宏)。2024/12/2343.?C語言代碼#include"stdio.h"/*預處理指令是以#號為開頭的代碼行,#include是一個文件包含預處理*/#defineg9.8/*g定義為無參宏*/#defineF(p,v)(p*9.8*v)/*將浮力計算公式定義為有參宏,物體體積v和液體密度p為參數(shù),也可將F(p,v)定義為(p*g*v),即有參宏的嵌套定義*/voidmain(){floatF1,F2;floatp,v;/*以下部分計算物體在水中的浮力F1*/printf("請輸入在水中物體的體積v\n");scanf("%f",&v);F1=1000*g*v;/*替換無參宏名g,將g替換成數(shù)值9.8*/printf("物體在水中的浮力是F1=%f\n",F1);/*以下部分計算不同物體在不同液體中的浮力F2*/printf("請輸入在某液體中液體的密度p和物體的體積v\n");scanf("%f,%f",&p,&v);F2=F(p,v); /*替換有參宏F(p,v),將F(p,v)替換為表達式p*9.8*v*//*如果采用宏的嵌套定義,F(xiàn)(p,v)首先替換為表達式p*g*v,再替換為p*9.8*v*/printf("物體在液體中的浮力F2=%f\n",F2);#undefg; /*取消g宏定義*/#undefF(p,v); /*取消宏F(p,v)定義*/}2024/12/2354.程序運行結果請輸入在水中物體的體積v12.2物體在水中的浮力是F1=119560請輸入在某液體中液體的密度p和物體的體積v700,24物體在液體中的浮力F2=1646402024/12/2367.1宏定義
宏定義是預處理命令中的一種,它提供了一種可以替換源代碼中字符串的機制。根據宏中是否有參數(shù),可以將宏定義分為不帶參數(shù)的宏定義和帶參數(shù)的宏定義。2024/12/237宏定義是預處理命令中的一種,它提供了一種可以替換源代碼中字符串的機制。根據宏中是否有參數(shù),可以將宏定義分為不帶參數(shù)的宏定義和帶參數(shù)的宏定義。2024/12/2387.1.1不帶參數(shù)的宏定義
不帶參數(shù)的宏定義格式如下:#define標識符字符串宏定義格式中“標識符”為用戶定義標識符,稱為宏名,也叫符號常量,一般用大寫字母表示。字符串可以是常量、表達式、格式串等。注意:宏定義不是C語言的語句,宏定義結尾沒有分號。2024/12/239說明:(1)預處理中,源程序在宏定義之后出現(xiàn)的所有與宏名一樣的標識符都替換成宏定義中的字符串,不做語法檢查。例如:將#defineg9.8錯誤地寫成#defineg98,則在編譯預處理中將g替換為98進行編譯。(2)源程序中宏可以嵌套定義。例如,計算圓柱體體積:#defineR6.3#defineHIGHT12.5#defineVOLUME(3.14*R*R*HIGHT)/*宏的嵌套定義*/在?#defineVOLUME(3.14*R*R*HIGHT)中HIGHT和R宏定義VOLUME在之前,即為宏嵌套定義。2024/12/2310嵌套定義的替換過程為由外到內,例如:①將宏名R進行替換,替換結果為#defineVOLUME(3.14*6.3*6.3*HIGHT)②將宏名HIGHT進行替換,替換結果為#defineVILUME(3.14*6.3*6.3*12.5)案例一中:#defineg9.8 /*g定義為無參宏*/#defineF(p,v)(p*g*v) /*g宏定義在F之前,也是宏的嵌套定義*/(3)宏定義的作用域。一個宏名與變量一樣也有它的作用域,宏名的作用范圍從該宏名的宏定義處開始到所在文件的結尾,或用#undef命令取消該宏定義為止。例如,在如下程序段計算物體在水中的浮力,#include"stdio.h"#defineg9.8 /*宏名g定義開始*/voidmain(){floatF1;floatp,v;...printf("F1=%f\n",F1);undefg; /*undef使得g的宏定義的作用范圍到此處為止*/#defineg9.78 /*宏名g重新定義新的精度*/
…}2024/12/23117.1.2帶參數(shù)的宏定義
帶參數(shù)的宏定義格式如下:#define宏名(參數(shù)表)字符串宏名一般為大寫,參數(shù)表可以有一個或多個參數(shù)組成,參數(shù)之間用逗號分隔。例如案例一中,#defineF(p,v)(p*9.8*v),p和v為參數(shù)。帶參數(shù)宏的調用格式如下:宏名(實參表)即將實參替換形參,其他部分不變。例如,假設有#defineSW(x)(x)*(x)如果程序中有語句x=SW(5);,那么編譯系統(tǒng)會將SW(5)替換為5*5。但輸出語句雙引號中的宏定義不做替換。例如:#defineXYZthisisatestprintf("XYZ");輸出XYZ,而不是thisisatest。2024/12/2312說明:(1)定義時參數(shù)和字符串部分要分別用括號括起來,宏名與參數(shù)表的括號之間不要加空格,否則就成為不帶參數(shù)的宏定義語句了。(2)為了保證在宏展開后,字符串中各個參數(shù)的計算順序正確,應當在宏定義中的字符串最外面以及其中的各個參數(shù)外面加上圓括號。例如,比較以下兩個例子。①#definesqr(x)(x*x)②#definesqr(x)((x)*(x))如果在后續(xù)程序中有s=sqr(a+b),程序在預處理時會產生不同的結果:①sqr(x)替換為(a+b*a+b);②sqr(x)替換為(a+b)*(a+b)。(3)在帶參宏定義時,也有宏嵌套定義。(4)帶參數(shù)的宏和函數(shù)存在相似之處。例如它們的表示形式都是由一個名字加上幾個參數(shù),引用方式也相同,實參和形參的個數(shù)都要求相同,但是要注意它們之間的區(qū)別。比較以下有參宏和函數(shù)的定義:2024/12/2313例7.1將一表達式分別定義為宏和函數(shù)。#include<stdio.h>#defineSQR(x)((x)*(x))/*宏定義以"#define"開頭,不需要對形參進行數(shù)據類型聲明,不需對宏進行宏類型聲明,在宏展開時只是完成替換。*/intSR(intx)/*函數(shù)定義沒有"#define",有參函數(shù)需要對形參進行數(shù)據類型聲明,函數(shù)調用時需要參數(shù)傳遞,要聲明函數(shù)的類型(int類型除外)。*/{return((x)*(x));}voidmain(){inti;i=1;printf("宏替換如下:\n");do{printf("%d\n",SQR(i++));/*宏替換*/}while(i<=5);i=1;printf("函數(shù)運行如下:\n");do{printf("%d\n",SR(i++));/*函數(shù)調用*/}while(i<=5);}2024/12/2314程序運行結果如下:宏替換如下:1925函數(shù)運行如下12/2315除以上幾點外,有參宏與函數(shù)不同還有:(1)代碼長度。每次使用時,宏定義代碼都被插入程序中,程序的長度將增長。函數(shù)定義代碼只出現(xiàn)于一個地方;每次使用這個函數(shù)時,都被調用那個地方的同一份代碼。(2)運算速度。宏替換只占編譯時間,不占用運行時間。函數(shù)由于在函數(shù)調用開始和返回時要進行相應的處理,因此要占用一些運行時間。(3)處理時間不同。宏展開是在編譯預處理時進行的。函數(shù)調用是在程序運行時處理的,并且要為函數(shù)分配內存空間。(4)參數(shù)求值。帶參數(shù)的宏是將形參用實參來代替,即簡單的字符替換。宏展開時都將重新求值。函數(shù)調用時,要先計算出實參表達式的值,然后將此值傳給形參;參數(shù)在函數(shù)調用時只求值一次。由于有參宏對參數(shù)沒有數(shù)據類型的約定,在某些情況下,使用有參宏定義會更方便:①有如下宏定義:#defineMAX1(a,b)((a>b)?a:b)/*a、b的數(shù)據類型可以是整型、浮點型*/②有如下函數(shù)定義:MAX2(inta,intb){return((a>b)?a:b);}/*a、b如果是浮點型,需修改形參的數(shù)據類型定義*/2024/12/2316案例二文件包含的使用1.問題描述根據物體的體積和液體密度,計算物體的浮力(假設物體全部沉入水中)。2.問題分析使用文件包含預處理,將#defineg9.8和#defineF(p,v)(p*g*v)保存在user.h文件,源程序中不再出現(xiàn)宏定義。2024/12/23173.?C語言代碼#include<stdio.h>#include"user.h"/*使用#include將宏定義所在文件加載到C源程序中*/main(){floatp,v,F2;printf("請輸入在某液體中液體的密度p和物體的體積v\n");scanf("%f,%f",&p,&v);F2=F(p,v);printf("物體在液體中的最大浮力F2=%f\n",F2);}4.程序運行結果請輸入在某液體中液體的密度p和物體的體積v700,15物體在液體中的最大浮力F2=1029002024/12/23187.2文件包含
文件包含的使用是編寫C語言程序中不可缺少的,我們在引用C語言庫函數(shù)時要使用它;另外,我們也可以將平時積累的一些有用的自定義函數(shù)做成一個自定義函數(shù)庫文件,要使用它們時只需采用文件包含將它們引用過來使用就行,這樣就減少了編程的工作量,提高編譯效率。文件包含定義格式如下:#include<文件名>或#include"文件名"2024/12/2319例如:#include<stdio.h>或#include"stdio.h"。一個文件包含預處理只能包含一個被包含文件。例如,使用文件包含計算一個實數(shù)的絕對值和的sin()值,并輸出。輸入輸出函數(shù)在stdio.h文件中,絕對值和sin()在math.h文件中,所以除了要在文件包含預處理中有stdio.h,還需要有math.h。#include<stdio.h>/*包含標準輸入輸出的頭文件stdio.h*/#include<math.h>/*包含數(shù)學函數(shù)的頭文件math.h*/main(){...}2024/12/2320除包含系統(tǒng)文件外,也可將用戶定義的宏保存在用戶文件中,在源程序需要宏的時候,將用戶文件包含在源文件中。如案例二中,將宏定義g和F定義于user.h文件中。使用文件包含,需注意以下幾點:(1)若使用符號<?>,系統(tǒng)到存放C庫函數(shù)頭文件所在目錄尋找要包含的文件,一般使用庫函數(shù)使用此符號;若使用符號"",系統(tǒng)在用戶程序所在的當前目錄尋找要包含的文件,如果找不到再到C庫函數(shù)頭文件所在目錄尋找,一般使用用戶函數(shù)使用此符號。(2)在預處理時,文件包含命令用被包含文件內容替換,成為源文件內容的一部分,與其他源文件代碼一起參加編譯。例如案例二中使用#include將stdio.h的所有內容,與user.h包含宏定義的文件內容嵌入到該預處理命令處成為源文件的一部分。(3)可以將多個需要包含的內容寫到一個頭文件中,如案例二;也可以將文件進行嵌套包含。2024/12/2321例7.2文件嵌套包含的使用。將?#defineF(p,v)(p*g*v)宏定義保存在user1.h中,#defineg9.8宏定義保存在user2.h中。user1.h文件內容:#include"user2.h"#defineF(p,v)(p*g*v)user2.h文件內容:#defineg9.8/*注意:這里沒有文件包含預處理*/使用文件嵌套預處理之后,案例二中的文件預處理程序段如下所示:#include"stdio.h"#include"user1.h"/*使用文件包含,將宏定義的g和F進行預處理*/main(){floatp,v,F2;printf("請輸入在某液體中液體的密度p和物體的體積v\n");scanf("%f,%f",&p,&v);F2=F(p,v);printf("theF2is%f\n",F2);}2024/12/2322程序運行結果如下:請輸入在某液體中液體的密度p和物體的體積v700,24theF2=164640這與案例二中計算在某液體中物體受到的浮力結果相同。2024/12/2323案例三#ifdef命令和#ifndef命令的使用1.問題描述編寫程序,使程序編譯后的程序既能夠在16位機上運行的目標代碼,也能在32位機上運行的目標代碼。2.問題分析16位機與32位機在數(shù)據類型上主要是整數(shù)存儲長度不一樣,采用條件編譯解決數(shù)據位數(shù)的問題。2024/12/23243.?C語言代碼#include<stdio.h>main(){#ifdefPC16/*若PC16被定義為宏,則完成以下預處理*/#defineINTSIZE16/*?16位整型被定義為宏INTSIZE*/#else/*若PC16未被定義為宏,則完成以下預處理*/#defineINTSIZE32/*32位整型數(shù)被定義為宏INTSIZE*/#endif/*#ifdef結束*/}2024/12/23257.3條件編譯
為了測試程序運行情況,可以通過在程序中添加一些輸出語句,根據輸出的結果判定程序運行結果是否正確,對錯誤的程序進行修改直到滿足需要。調試結束后將這些輸出語句再進行刪除。C語言提供了條件編譯預處理,能更好的解決測試問題。對程序中的所有源代碼有時只需要對其中部分代碼進行編譯,也就是對部分代碼有選擇地進行編譯,該過程稱為條件編譯。條件編譯主要有#ifdef命令、#ifndef命令還有#if命令。條件編譯主要有以下幾種形式,#ifdef和#ifnde,以及#if,分別如表7-1~7-3所示2024/12/2326表7-1#ifdef條件編譯形式條件編譯形式說明#ifdef宏名語句
#endif如果宏名被定義過,則執(zhí)行語句#ifdef宏名語句1#else
語句2#endif宏名如果宏名被定義過,則執(zhí)行語句1,否則執(zhí)行語句22024/12/2327表7-2#ifndef條件編譯形式條件編譯形式說明#ifndef宏名語句
#endif如果宏名未被定義過,則執(zhí)行語句#ifndef宏名語句1#else
語句2#endif如果宏名未被定義過,則執(zhí)行語句1,否則執(zhí)行語句22024/12/2328表7-3#if條件編譯形式條件編譯形式說明#if表達式1
程序段1#endif如果表達式1為真,則執(zhí)行程序段1#if表達式1程序段1#else程序段2#endif如果表達式1為真,則執(zhí)行程序段1,否則執(zhí)行程序段2#if表達式1程序段1#elif表達式2程序段2#endif如果表達式1為真,則執(zhí)行程序段1,否則表達式2為真,執(zhí)行程序段22024/12/2329(1)?#if命令中表達式必須是常數(shù)表達式,不能包含變量,因為條件編譯在編譯預處理時進行,而在預處理時不可能知道變量的值。(2)?#if和#elif常常與defined命令配合使用,defined命令的格式為defined(宏名)或defined宏名功能:判斷某個宏是否已經定義,如果已經定義,defined命令返回1,否則返回0。defined命令只能與#if或#elif配合使用,不能單獨使用。例如,#ifdefined(USA)的含義是“如果定義了宏USA”。2024/12/2330例7.3#if命令的使用:根據需求計算3個數(shù)中最大值或最小值。#include<stdio.h>#defineMAX1voidmain(){inta,b,c,max,min;printf("input3numbers:");
scanf("%d%d%d",&a,&b,&c);#ifMAX/*定義的宏為真(或非0)則完成以下程序段;也可寫為#ifdefine*/
{max=a; if(b>max)max=b; if(c>max)max=c;printf("themax=%d\n",max);}#else{min=a; if(b<min)min=b; if(c<min)min=c;printf("themin=%d\n",min);}#endif}2024/12/2331程序運行結果如下:input3numbers:347421themax=74說明:(1)當程序調試完成后,使編譯條件改變?yōu)椴粷M足調試條件,原來添加的輸出信息就不參與編譯,相當于被刪除了。(2)?#if語句可以減少目標代碼的長度,而使用if語句將對整個程序進行編譯,所以目標程序會比較長。2024/12/2332本章小結本章介紹了宏定義、文件包含和條件編譯三種編譯預處理。編譯預處理是C語言的一大特色,也是C語言與其他高級語言的重要區(qū)別之一。編譯預處理與源程序編譯不同,編譯預處理是在編譯之前對預處理指令先進行處理。常用的預處理語句主要有宏、文件包含和條件編譯。宏定義時用一個標識符來表示一個常量或表達式,在宏調用中將標識符替換成常量或表達式。宏增加編譯的時間,但不增加程序運行的時間。文件包含可以將多個源文件連接成一個源文件一起進行編譯,并生成一個目標文件。條件編譯可根據設定條件來實現(xiàn)對源程序中的某一部分進行編譯,合理的使用編譯預處理將使得程序更具有移植性和靈活性。使用預處理功能便于程序的修改、閱讀、移植和調試,也便于實現(xiàn)模塊化程序設計。2024/12/2333預處理命令
學習的意義
C語言的一個重要特征是它的預處理功能。我們知道,一個高級語言源程序在計算機上運行,必須先用編譯程序將其翻譯為機器語言。編譯包括詞法分析、語法分析、代碼生成、代碼優(yōu)化等步驟,有時在編譯之前還要做某些預處理工作,如去掉注釋,變換格式等。C語言允許在源程序中包含預處理命令,在正式編譯之前(詞法分析之前)系統(tǒng)先對這些命令進行“預處理”,然后整個源程序再進行通常的編譯處理。從語法上講,這些預處理命令不是C語言的一部分,但使用它們卻擴展了C語言程序設計的環(huán)境,可以簡化程序開發(fā)過程,提高程序的可讀性,也更有利于移植和調試C語言程序。本章主要介紹宏定義、文件包括和條件編譯等預處理命令。2024/12/2334學習的意義
源程序生成執(zhí)行文件的過程:C語言源程序.c或.cpp編譯目標程序.obj鏈接執(zhí)行程序.exe#include<stdio.h>#definePI3.14159voidmain(){floatr=4;printf(“s=%f\n”,PI*r*r);}預處理命令預處理本章討論之重點!2024/12/2335必須正確區(qū)別預處理命令和C語句、區(qū)別預處理和編譯,才能正確使用預處理命令。C語言與其他高級語言的一個重要區(qū)別是可以使用預處理命令和具有預處理的功能。C提供的預處理功能主要有以下三種:1.宏定義2.文件包含3.條件編譯分別用宏定義命令、文件包含命令、條件編譯命令來實現(xiàn)。為了與一般C語句相區(qū)別,這些命令以符號“#”開頭。語句尾不用分號作結束符,每條語句占一行。2024/12/23367.1宏定義
宏定義分為兩種:不帶參數(shù)的宏定義和帶參數(shù)的宏定義。
1、不帶參數(shù)的宏定義
一般形式
#define標識符單詞串指令名稱宏名,被定義代表后面的單詞串
宏體,是宏的內容文本
可缺省,表示宏名定義過或取消宏體
功能
用指定標識符(宏名)代替字符序列(宏體)如
#defineYES1#defineNO0#definePI3.1415926#defineOUTprintf(“Hello,World”);#defineSIZE10#defineINT_STR
"%d"voidmain()
{inta[SIZE],i;for(i=0;i<SIZE;i++)scanf(INT_STR,&a[i]);for(i=SIZE-1;i>=0;i--)printf(INT_STR,a[i]);}宏定義voidmain()
{inta[10],i;for(i=0;i<10;i++)scanf("%d",&a[i]);for(i=10-1;i>=0;i--)printf("%d",a[i]);}預編譯處理后
注意:宏替換時僅僅是將源程序中與宏名相同的標識符替換成宏的內容文本,并不對宏的內容文本做任何處理。2024/12/2337
宏定義注意事項
C程序員通常用大寫字母來定義宏名,以便與變量名區(qū)別。
如:#definePI3.14159
宏定義的位置任意,但一般放在函數(shù)外面。
宏定義時,如果單詞串太長,需要寫多行,可以在行尾使用反斜線“\”續(xù)行符例如:#defineLONG_STRING"thisisaverylongstringthatis\usedasanexample"
宏名的作用域是從#define定義之后直到該宏定義所在文件結束
#undef可終止宏名作用域#undef標識符#defineYES1voidmain(){……..}#undefYES#defineYES0voidmax(){……..}YES原作用域YES新作用域
宏定義可以嵌套定義,但不能遞歸定義
#defineR2.0#definePI3.14159#defineL2*PI*R(√)#defineSPI*R*R(√)#defineMM+10(×)
程序中字符串常量即雙引號中的字符,不作為宏進行宏替換操作
#defineXYZthisisatestprintf("XYZ");輸出:XYZ,而不是:thisisatest。2024/12/2338
宏定義注意事項
宏定義一般以換行結束,不要用分號結束,以免引起不必要的錯誤#definePI3.14;
a=PI*2*2;
預編譯處理后a=3.14;*2*2;
錯誤!
宏可以被重復定義。
#defineN10
//第一次宏定義intf(){N的內容是10return(N*N);}#defineN20
//第二次宏定義voidmain(){N的內容是20printf("%d\n",N+f());}
在定義宏時,如果宏是一個表達式,那么一定要將這個表達式用()括起來,否則可能會引起非預期的結果。
#defineNUM110#defineNUM220#defineNUMNUM1+NUM2voidmain()
{inta=2,b=3;a*=NUM;b=b*NUM;printf("a=%d,b=%d\n",a,b);}voidmain()
{inta=2,b=3;a*=10+20;b=b*10+20;printf("a=%d,b=%d\n",a,b);}預編譯處理后輸出結果:a=60,b=50
()()()輸出結果:a=60,b=90
2024/12/23392、帶參數(shù)的宏定義
一般形式
#define標識符(參數(shù)列表)單詞串參數(shù)表由一個或多個參數(shù)構成,參數(shù)只有參數(shù)名,沒有數(shù)據類型符,參數(shù)之間用逗號隔開,參數(shù)名必須是合法的標識符通常會引用宏的參數(shù)
例:
#defineS(a,b)a*b………..area=S(3,2);宏展開:area=3*2;宏展開:形參用實參換,其它字符保留宏體及各形參外一般應加括號()不能加空格例
#defineS(r)PI*r*r相當于定義了不帶參宏S,代表字符串“(r)PI*r*r”
例
#definePOWER(x)x*xx=4;y=6;z=POWER(x+y);宏展開:z=x+y*x+y;一般寫成:#definePOWER(x)((x)*(x))宏展開:
z=((x+y)*(x+y));2024/12/2340#defineMAX(x,y)(x)>(y)?(x):(y)…….voidmain(){inta,b,c,d,t;…….t=MAX(a+b,c+d);……}宏展開:t=(a+b)>(c+d)?(a+b):(c+d);intmax(intx,inty){return(x>y?x:y);}voidmain(){inta,b,c,d,t;…….t=max(a+b,c+d);………}【例】用宏定義和函數(shù)實現(xiàn)同樣的功能2024/12/2341帶參的宏與函數(shù)區(qū)別帶參宏函數(shù)處理時間編譯時程序運行時參數(shù)類型無類型問題定義實參、形參類型處理過程不分配內存,簡單的字符置換分配內存,先求實參值,再代入形參程序長度變長不變運行速度不占運行時間調用和返回占時間2024/12/23427.2文件包含處理過程
功能一個源文件可將另一個源文件的內容全部包含進來
一般形式#define<包含文件名>或
#define“包含文件名”
預編譯時,用被包含文件的內容取代該預處理命令,再對“包含”后的文件作一個源文件編譯<>:
直接到系統(tǒng)指定的“文件包含目錄”去查找被包含的文件“
”:系統(tǒng)首先到當前目錄下查找被包含文件,如果沒找到,再到系統(tǒng)指定的“文件包含目錄”去查找。
預編譯處理后A源文件prg1.cpp#include"prg1.cpp"
B源文件prg2.cppBA新源文件prg2.cpp2024/12/2343文件包含舉例:#include"head.h"
#include"func.cpp"
voidmain(){inta,b,c;a=getnum();b=getnum();c=max(max(a,b),NUM);printf("MAX=%d\n",c);}(stdio.h文件中的內容)
#defineNUM10intmax(intx,inty){return(x>y?x:y);}intgetnum(){inta;scanf("%d",&a)return(a);}voidmain(){inta,b,c;a=getnum();b=getnum();c=max(max(a,b),NUM);printf("MAX=%d\n",c);}#include<stdio.h>#defineNUM10intmax(intx,inty){return(x>y?x:y);}intgetnum(){inta;scanf("%d",&a)return(a);}預編譯處理后2024/12/2344文件包含的優(yōu)點:
一個大程序,通常分為多個模塊,并由多個程序員分別編程。有了文件包含處理功能,就可以將多個模塊共用的數(shù)據(如符號常量和數(shù)據結構)或函數(shù),集中到一個單獨的文件中(如上例中的文件head.h和func.cpp)。這樣,凡是要使用其中數(shù)據或調用其中函數(shù)的程序員,只要使用文件包含處理功能,將所需文件包含進來即可,不必再重復定義它們,從而減少重復勞動。文件包含的幾點說明
常用在文件頭部的被包含文件,稱為“標題文件”或“頭部文件”,常以.h(head)作為后綴,簡稱頭文件。在頭文件中,除可包含宏定義外,還可包含外部變量定義、結構類型定義等。
一條包含命令,只能指定一個被包含文件。如果要包含n個文件,則要用n條包含命令。
文件包含可以嵌套,即被包含文件中又包含另一個文件。2024/12/23457.3條件編譯根據一定的條件去編譯源文件的不同部分,這就是條件編譯。1、#if~#endif形式
格式:#if
條件1
程序段1#elif條件2
程序段2……#else
程序段n#endif常量表達式。通常會用到宏名,條件可以不加括號“()”
#elif和#else可以沒有
#endif必須存在,它是#if命令的結尾
如果條件1為真就編譯程序段1,否則如果條件2為真就編譯程序段2,…,如果各條件都不為真就編譯程序段n。
作用:
#if和#elif常常與defined命令配合使用,defined命令的格式為:
defined(宏名)或defined宏名功能:判斷某個宏是否已經定義,如果已經定義,defined命令返回1,否則返回0。Defined命令只能與#if或#elif配合使用,不能單獨使用。例如:#ifdefined(USA)的含義是“如果定義了宏USA”。
2024/12/2346例:下面的程序利用ACTIVE_COUNTRY定義貨幣的名稱
#defineUSA0#defineENGLAND1#defineFRANCE2#defineACTIVE_COUNTRYUSA
#ifACTIVE_COUNTRY==USA
char*currency=“dollar”;
//有效
#elifACTIVE_COUNTRY==ENGLANDchar*currency="pound"
;#elsechar*currency="france"
;#endifvoidmain(){floatprice1,price2,sumprice;scanf("%f%f",&price1,&price2);sumprice=price1+price2;printf("sum=%.2f%s",sumprice,currency);}char*currency=“dollar”;
voidmain(){floatprice1,price2,sumprice;scanf("%f%f",&price1,&price2);sumprice=price1+price2;printf("sum=%.2f%s",sumprice,currency);}預編譯處理后2024/12/23472、#ifdef~#endif形式
格式:#ifdef宏名程序段1#else
程序段2#endif等價于“#ifdefined(宏名)”
在#ifdef和#else之間可以加多個#elif命令如果宏名已被#define行定義,則編譯程序段1,否則編譯程序段2
作用:#defineINTEGER#ifdefINTEGER
intadd(intx,inty)//有效
{return(x+y);}#elsefloatadd(floatx,floaty){return(x+y);}#endifvoidmain(){#ifdefINTEGER
inta,b,c;//有效
scanf("%d%d",a,b);printf("a+b=%d\n",add(a,b));#elsefloata,b,c;scanf("%f%f",a,b);printf("a+b=%f\n",add(a,b));#endif}intadd(intx,inty)//有效
{return(x+y);}voidmain(){inta,b,c;//有效
scanf("%d%d",a,b);printf("a+b=%d\n"
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 雨水收集利用的政策與實踐分析計劃
- 教學評價與反思落實計劃
- 人事部年度工作計劃分析
- 塔吊相關項目投資計劃書范本
- 班級時事討論活動的開展計劃
- 《促銷員升級培訓》課件
- 跨部門協(xié)作與整合培訓
- 《供電系統(tǒng)節(jié)能改》課件
- 《高端餐飲成都》課件
- 輕度抑郁發(fā)作護理查房
- 人工智能智慧樹知到期末考試答案章節(jié)答案2024年復旦大學
- (高清版)JTGT D81-2017 公路交通安全設施設計細則
- 植物田間技術(下)智慧樹知到期末考試答案章節(jié)答案2024年中國農業(yè)大學
- 粵教版科學四年級上冊全冊試卷(含答案)
- DB51T3062-2023四川省高標準農田建設技術規(guī)范
- QC(質量管理)培訓課件
- 西方思想經典導讀知到章節(jié)答案智慧樹2023年湖南師范大學
- 項目經理競聘匯報(23張PPT)
- (完整版)繪本《彩虹色的花》原文
- 預拌混凝土企業(yè)質量管理體系·程序文件
- 股權收購協(xié)議(律師整理版)
評論
0/150
提交評論