C語言程序設(shè)計(jì)課件1第4章 C++程序的結(jié)構(gòu)_第1頁
C語言程序設(shè)計(jì)課件1第4章 C++程序的結(jié)構(gòu)_第2頁
C語言程序設(shè)計(jì)課件1第4章 C++程序的結(jié)構(gòu)_第3頁
C語言程序設(shè)計(jì)課件1第4章 C++程序的結(jié)構(gòu)_第4頁
C語言程序設(shè)計(jì)課件1第4章 C++程序的結(jié)構(gòu)_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第4章

C++程序的結(jié)構(gòu)

1.區(qū)分各種變量的類型以及在內(nèi)存中的存放2.理解局部靜態(tài)變量的雙重特征3.區(qū)分各種類型標(biāo)識(shí)符以及其作用域與可見性4.掌握預(yù)處理命令的常用用途5.理解名字空間的概念與使用方法學(xué)習(xí)目標(biāo)

4.1變量的類型

intg=100000;intsum(intx,inty){intsum=0;for(inti=x;i<=y;i++)sum=sum+i;returnsum;}intmain(){intx=1,y=100;cout<<sum(x,y)+g<<endl;return0;}1234567891011121314g為全局變量sum()中

x、y為局部變量main()中的

x、y為局部變量

除了按數(shù)據(jù)類型區(qū)分變量外,根據(jù)變量定義的位置,可以把變量分成全局變量(globalvariable)與局部變量(localvariable)。全局變量是指定義在函數(shù)體外部的變量,它能被所有函數(shù)使用。局部變量是指定義在函數(shù)或復(fù)合語句中定義的變量,只能在函數(shù)或復(fù)合語句中使用。4.1.2變量的存儲(chǔ)類型

C++中變量有auto、extern、register、static四種存儲(chǔ)類型。1.auto說明符

auto說明符說明定義的是一個(gè)局部變量。函數(shù)中的局部變量,如果不用關(guān)鍵字static加以聲明,編譯系統(tǒng)對它們是動(dòng)態(tài)分配存儲(chǔ)空間的。局部變量默認(rèn)存儲(chǔ)類型為auto,所以在程序中很少使用auto說明符說明。

2.register說明符為提高執(zhí)行效率,C++允許將局部變量的值存放在CPU的寄存器中,需要時(shí)直接從寄存器中取出參加運(yùn)算,不必到內(nèi)存中去存取,這種類型的局部變量稱為寄存器變量,用關(guān)鍵字register聲明。在程序中定義寄存器變量對編譯系統(tǒng)只是建議性的,而不是強(qiáng)制性的。3.extern說明符如果一個(gè)完整的計(jì)算機(jī)程序很大,分成多個(gè)模塊,放在不同的文件中,分開編譯成目標(biāo)文件,最后連接成一個(gè)完整的可執(zhí)行代碼。對于所有模塊共同使用的全局變量,如果在所有的模塊中都定義,在連接時(shí)就會(huì)出錯(cuò)。解決辦法是只在一個(gè)模塊中定義全局變量,在其他模塊中用extern說明這是一個(gè)“外來”的全局變量。/****************************p4_1_p.cpp**extern型變量的使用****************************/#include<iostream>usingnamespacestd;externvoidp1dispG();externvoidp2dispG();externvoidp2dispg();intG=0,g=0;intmain(){p1dispG();p2dispG();p2dispg();cout<<"inpG="<<G<<endl;cout<<"inpg="<<g<<endl;return0;}12345678910111213141516171819//p4_1_p1.cpp#include<iostream>usingnamespacestd;externintG;voidp1dispG(){ G=11;cout<<"inp1G="<<G<<endl;}123456789//p4_1_p2.cpp#include<iostream>usingnamespacestd;externintG;externintg;voidp2dispG(){G=22;cout<<"inp2G="<<G<<endl;}voidp2dispg(){g=33;cout<<"inp2g="<<g<<endl;}123456789101112131415運(yùn)行結(jié)果:inp1G=11inp2G=22inp2g=33inpG=22inpg=334.1.2變量的存儲(chǔ)類型

4.static說明符

static說明符用于在定義變量時(shí)將變量聲明為成static(靜態(tài))變量。其格式為:

static可用來聲明全局靜態(tài)變量和局部靜態(tài)變量。當(dāng)聲明全局靜態(tài)變量時(shí),全局靜態(tài)變量只能供本模塊使用,不能被其它模塊再聲明為extern變量。例如:將程序p4_1_p.cpp中的全局變量聲明為:

staticintG=0;

那么在其他模塊中就不能聲明為:externintG;//錯(cuò)誤,G已經(jīng)是一個(gè)static變量;

static數(shù)據(jù)類型變量名=初值;

注意:

當(dāng)一個(gè)局部變量聲明為static變量,它既具有局部變量的性質(zhì):只能在函數(shù)體局部存取;又具有全局變量的性質(zhì):函數(shù)多次進(jìn)入,變量的值只初始化一次。因此靜態(tài)局部變量實(shí)質(zhì)是一個(gè)供函數(shù)局部存取的全局變量。/***********************************p4_2.cpp**靜態(tài)局部變量的使用***********************************/#include<iostream>usingnamespacestd;voidfun()

{staticintn=0;intm=0;n++;m++;cout<<"m="<<m<<",n="<<n<<endl;}intmain(){for(inti=0;i<4;i++)fun();return0;}

1234567891011121314151617181920

運(yùn)行結(jié)果:m=1n=1m=1n=2m=1n=3m=1n=4

4.1.2變量的存儲(chǔ)類型

靜態(tài)局部變量n只是在函數(shù)fun()第一次進(jìn)入時(shí)初始化0,隨后每次進(jìn)入不再賦初值

4.1.3變量在內(nèi)存中的存儲(chǔ)

當(dāng)一個(gè)程序準(zhǔn)備運(yùn)行時(shí),操作系統(tǒng)會(huì)為程序分配一塊內(nèi)存空間,C++程序的內(nèi)存通常被分為四個(gè)區(qū): ①全局?jǐn)?shù)據(jù)區(qū)(dataarea) ②代碼區(qū)(codearea) ③棧區(qū)(stackarea) ④堆區(qū)(heaparea)

全局變量、靜態(tài)變量、字符串常量和常變量存放在全局?jǐn)?shù)據(jù)區(qū);所有的函數(shù)和代碼存放在代碼區(qū);為運(yùn)行函數(shù)而分配的函數(shù)參數(shù)、局部變量和返回地址存放在棧區(qū);動(dòng)態(tài)分配內(nèi)存在堆區(qū)。

變量的生存期為從產(chǎn)生到消失的時(shí)期。全局變量、靜態(tài)變量、常變量生存周期為整個(gè)程序的生存周期,因此稱為靜態(tài)生存期;局部變量的生存周期起于函數(shù)調(diào)用,結(jié)束于函數(shù)調(diào)用結(jié)束,其生存期是動(dòng)態(tài)的,因此稱為動(dòng)態(tài)生存期。注意:

堆空間不是系統(tǒng)為程序自動(dòng)分配的,它是程序執(zhí)行過程中由new語句為變量分配的。即使指向堆空間的指針變量消失,new語句分配的空間也不會(huì)消失。new語句分配的空間由delete語句釋放。

/***************************************p4_3.cpp**顯示各類變量的內(nèi)存分配****************************************/#include<iostream>usingnamespacestd;intk=300;constinti=100;#definen10constintj=200;voidfun(inti=1,intj=2){

const

intk=3;

staticintl=0;char*p=newchar[n+1];for(intm=0;m<n;m++)p[m]='A'+m;p[m]='\0';cout<<"Adddressofparametervariable:"<<endl;

12345678910111213141516171819

4.1.3變量在內(nèi)存中的存儲(chǔ)

常變量(常量)、全局變量、局部靜態(tài)變量、字符串常量在程序運(yùn)行前在數(shù)據(jù)區(qū)進(jìn)行分配。并且依次按照常變量、全局變量、局部靜態(tài)變量的順序從低地址向高地址分配。常變量按定義的先后次序分配,全局變量、局部變量也一樣。

cout<<"&i="<<&i<<"\t"<<"&j="<<&j<<endl;cout<<"Adddressoflocalvariable:"<<endl;cout<<"&k="<<&k<<"\t"<<"&p="<<&p<<"\t"<<"&m="<<&m<<endl;cout<<"Adddressofstaticlocalvariable:"<<endl;cout<<"&l="<<&l<<endl;cout<<"Addressofheap:"<<(void*)p<<endl;cout<<"beforedeletep="<<p<<endl;

delete[]p;cout<<"afterdelete:"<<(void*)p<<endl;cout<<"p="<<p<<endl;}intmain(){L1: fun();L2: cout<<"Adddressofglobalvariable:"<<endl; cout<<"&i="<<&i<<"\t"<<"&j="<<&j<<"\t"<<"&k="<<&k<<endl;cout<<"Addressoffunction:"<<endl; cout<<"&fun="<<&fun<<"\t"<<"&main="<<&main<<endl;

return0;}

2021222324252627282930313233343536373940運(yùn)行結(jié)果:Addressofparametervariable:&i=0013FF2C &j=0013FF30Addressoflocalvariable:&k=0013FF20 &p=0013FF1C &m=0013FF18Addressofstaticlocalvariable:&l=0047773CAddressofheap:00480410 //釋放堆空間前指針的值beforedeletep=ABCDEFGHIJ //釋放堆空間前堆中的內(nèi)容afterdelete:00480410 //釋放堆空間后指針的值不變p=葺葺葺葺葺葺葺?//釋放堆空間后,堆中的內(nèi)容無意義Addressofglobalvariable:&i=0046C01C &j=0046C020 &k=00474DC0Addressoffunction:&fun=004010A0 &main=0040123F4.1.2變量的存儲(chǔ)類型

4.1.2變量的存儲(chǔ)類型解釋

:當(dāng)函數(shù)被調(diào)用時(shí)才為函數(shù)的形參、返回代碼地址、局部變量分配空間。由于空間在棧中,所以從棧底開始依次按形參、返回代碼地址、局部變量的順序從高地址向低地址分配。其中,在分配形參地址時(shí),按從右向左的順序;分配各局部變量的地址時(shí),按定義的先后次序。當(dāng)函數(shù)調(diào)用結(jié)束,該函數(shù)占用的??臻g收回。收回的順序(即各變量消失的順序)與分配的順序相反。程序運(yùn)行時(shí),系統(tǒng)為各個(gè)函數(shù)的執(zhí)行代碼在代碼段中分配空間,然后將代碼調(diào)入內(nèi)存。各函數(shù)在代碼區(qū)的排列次序按函數(shù)定義的先后次序。程序運(yùn)行結(jié)束,程序占用的代碼段空間收回。全局常變量、全局變量、局部靜態(tài)變量、字符串常量在程序運(yùn)行前在全局?jǐn)?shù)據(jù)區(qū)進(jìn)行分配。并且依次按照全局常變量、全局變量、局部靜態(tài)變量的順序從低地址向高地址分配,其中各類變量按定義的先后次序分配。當(dāng)程序運(yùn)行結(jié)束后,各全局變量的空間被系統(tǒng)收回,收回的順序與分配的順序相同,即:先分配先收回。堆空間不是系統(tǒng)為程序自動(dòng)分配的,它是程序執(zhí)行過程中由new語句為變量分配的。即使指向堆空間的指針變量消失,new語句分配的空間也不會(huì)消失。New語句分配的空間由delete語句釋放。變量的生存期為從產(chǎn)生到消失的時(shí)期。全局變量、靜態(tài)變量、常變量生存周期為整個(gè)程序的生存周期,因此稱為靜態(tài)生存期;局部變量的生存周期起于函數(shù)調(diào)用,結(jié)束于函數(shù)調(diào)用結(jié)束,其生存期是動(dòng)態(tài)的,因此稱為動(dòng)態(tài)生存期。4.2標(biāo)識(shí)符的作用域與可見性

標(biāo)識(shí)符的作用域是標(biāo)識(shí)符在程序源代碼中的有效范圍,從小到大分為函數(shù)原型作用域、塊作用域(局部作用域),文件作用域(全局作用域)。1.函數(shù)原型作用域函數(shù)原型作用域是C++程序中最小作用域。函數(shù)原型聲明時(shí)形式參數(shù)的作用范圍就是函數(shù)原型的作用域。例如:有下列函數(shù)聲明:

fun(inti,intj);

標(biāo)識(shí)符i、j的作用域?yàn)楹瘮?shù)原型,即函數(shù)fun形參的兩個(gè)括號(hào)之間,在其他地方不能引用這些標(biāo)識(shí)符。2.塊作用域所謂的塊就是用{}括起來的一段程序,在塊中定義的標(biāo)識(shí)符,作用域從聲明處開始,一直到塊的大括號(hào)為止。其中有下列情況屬于一個(gè)塊:

(1)

函數(shù)的形參與函數(shù)體屬于一個(gè)塊;

(2)for()語句中,括號(hào)()中屬于一個(gè)塊;/***************************************p4_4.cpp**標(biāo)識(shí)符作用域****************************************/#include<iostream>usingnamespacestd;inti=100,j=200;voidfun(inti=2){cout<<"L2:i="<<i<<endl;{inti=3;cout<<"L3:i="<<i<<endl;

{for(inti=4;i<5;cout<<"L6:i="<<i<<endl,i++)1234567891011121314154.2標(biāo)識(shí)符的作用域與可見性i=5i=4i=3i=2

{}}{cout<<"L4:i="<<i<<endl;inti=5 i++;cout<<"L5:i="<<i<<endl;}}}}intmain(){fun();return0;}1617181920212223242526272829運(yùn)行結(jié)果:L2:i=2L3:i=3L4:i=4L5:i=6L6:i=44.2標(biāo)識(shí)符的作用域與可見性4.2標(biāo)識(shí)符的作用域與可見性

4.可見性程序運(yùn)行到某一處,能夠引用到的標(biāo)識(shí)符,稱為該處可見到的標(biāo)識(shí)符??梢娦员硎緩哪程幠芸吹绞裁础?梢娦缘囊话阋?guī)則是:

(1)

內(nèi)層可以看到外層定義的各種標(biāo)識(shí)符。

(2)

如果內(nèi)、外層塊定義的標(biāo)識(shí)符同名,實(shí)質(zhì)代表不同的實(shí)體,內(nèi)層只能看到與之最近的標(biāo)識(shí)符,相當(dāng)于外層標(biāo)識(shí)符被內(nèi)層同名的標(biāo)識(shí)符隱藏了。

(3)

內(nèi)層標(biāo)識(shí)符的作用域不能覆蓋(作用)到外層,所以外層看不到內(nèi)層的標(biāo)識(shí)符。

(4)

同層中,后面語句定義的標(biāo)識(shí)符作用域不能作用到前面語句和塊。因此,前面語句看不到后面語句定義的標(biāo)識(shí)符。

(5)

作用域作用的方向?yàn)閺耐庀騼?nèi)、從前向后;可見性的方向則從內(nèi)向外、從后向前。4.3程序的文件結(jié)構(gòu)與編譯預(yù)處理命令

一個(gè)高級(jí)語言源程序在計(jì)算機(jī)上運(yùn)行,必須先用編譯程序?qū)⑵浞g為機(jī)器語言。在編譯之前還要做某些預(yù)處理工作,如去掉注釋,變換格式等。

C++源程序中以#開頭、以換行符結(jié)尾的行稱為預(yù)處理命令。預(yù)處理命令不是C++語言的語法成分,在編譯前由預(yù)處理器執(zhí)行,在目標(biāo)程序中,不含預(yù)處理指令對應(yīng)的機(jī)器碼。因此,預(yù)處理命令不以分號(hào)結(jié)尾。

許多預(yù)處理命令更適合C程序員,但為了處理C遺留的代碼,C++編程者也應(yīng)該熟悉預(yù)處理命令。

4.3程序的文件結(jié)構(gòu)與編譯預(yù)處理命令

4.3.1.文件包括#include命令

文件包含是指在一個(gè)C++源程序中通過#include命令將另一個(gè)文件(通常是.h、.c或.cpp為后綴的文件)的全部內(nèi)容包含進(jìn)來。

文件包含處理命令的一般格式為:

編譯時(shí)預(yù)編譯器將被包含文件的內(nèi)容插入到源程序中#include命令的位置,以形成新的源程序。

#include<被包含文件名>或

#include"被包含文件名"/******************************p4_5.cpp**主程序******************************/#include<iostream>usingnamespacestd;#include"mymath.h"intmain(){cout<<max(5,6)<<endl;return0;}1234567891011//********************************mymath.h**一些自定義的數(shù)學(xué)函數(shù)*********************************/#include<iostream>usingnamespacestd;intmax(intx,inty){returnx>y?x:y;}12345678910#include<iostream>usingnamespacestd;#include<iostream>usingnamespacestd;intmax(intx,inty){returnx>y?x:y;}intmain(){cout<<max(5,6)<<endl;return0;}123456789101112

對主程序p4_5.cpp編譯時(shí)預(yù)處理程序執(zhí)行#include"mymath.h",將p4_5.cpp變成:

4.3程序的文件結(jié)構(gòu)與編譯預(yù)處理命令

4.3.2.不帶參數(shù)的宏定義

宏定義分為兩種:不帶參數(shù)的宏定義和帶參數(shù)的宏定義。

#define命令定義一個(gè)標(biāo)識(shí)符來代表一個(gè)字符串(表達(dá)式),在源程序中發(fā)現(xiàn)該標(biāo)識(shí)符時(shí),都用該字符串替換,以形成新的源程序。這種標(biāo)識(shí)符稱為宏名(macroname),將程序中出現(xiàn)的與宏名相同的標(biāo)識(shí)符替換為字符串的過程稱為宏替換或宏代換(macrosubstitulition)。不帶參數(shù)的宏定義的一般形式是:

其中:#define是宏定義命令名稱。標(biāo)識(shí)符(宏名)被定義用來代表后面的單詞串。單詞串是宏的內(nèi)容文本,也稱為宏體,可以是任意以回車換行結(jié)尾的文字。單詞串一般不用分號(hào)結(jié)尾。#define標(biāo)識(shí)符單詞串

源程序#include<iostream>usingnamespacestd;#defineSIZE10#defineNEWLINE"\n"#defineTAB"\t"intmain(){inta[SIZE],i;for(i=0;i<SIZE;i++)cout<<a[i]<<TAB;cout<<NEWLINE;return0;}12345678910111213預(yù)編譯處理(宏替換)后的源程序#include<iostream>usingnamespacestd;#defineSIZE10#defineNEWLINE"\n"#defineTAB"\t"intmain(){inta[10],i;for(i=0;i<10;i++)cout<<a[i]<<"\t";cout<<"\n";return0;}12345678910111213注意:

宏替換時(shí)僅僅是將源程序中與宏名相同的標(biāo)識(shí)符替換成宏的內(nèi)容文本,并不對宏的內(nèi)容文本做任何處理。4.3程序的文件結(jié)構(gòu)與編譯預(yù)處理命令

宏定義時(shí),要注意以下幾點(diǎn):程序員通常用大寫字母來定義宏名,以便與變量名區(qū)別。這種習(xí)慣幫助讀者迅速識(shí)別發(fā)生宏替換的位置。同時(shí)最好把所有宏定義放在文件的最前面或另一個(gè)單獨(dú)的文件中,不要把宏定義分散在文件的多個(gè)位置。宏定義時(shí),如果單詞串太長,需要寫多行,可以在行尾使用反斜線\續(xù)行符。例如:

#defineLONG_STRING"thisisaverylongstringthatis\usedasanexample"雙引號(hào)包括在替代的內(nèi)容之內(nèi)。宏名的作用域是從#define定義之后直到該宏定義所在文件結(jié)束,但通常把#define宏定義放在源程序文件的開頭部分。如果需要終止宏的作用域,可以使用#undef命令,其一般格式為:宏定義可以嵌套定義、被重復(fù)定義,但不能遞歸定義。程序中字符串常量即雙引號(hào)中的字符,不作為宏進(jìn)行宏替換操作。在定義宏時(shí),如果宏是一個(gè)表達(dá)式,那么一定要將這個(gè)表達(dá)式用()括起來,否則可能會(huì)引起非預(yù)期的結(jié)果。

#undef標(biāo)識(shí)符

4.3程序的文件結(jié)構(gòu)與編譯預(yù)處理命令4.3.3.帶參數(shù)的宏定義

#define還有一個(gè)重要的功能:定義帶參數(shù)的宏。這樣的宏因?yàn)槎x成一個(gè)函數(shù)調(diào)用的形式,也被稱為類函數(shù)宏。在C++中由于可以使用函數(shù)模板,這種用宏定義的函數(shù)模板被取代。

帶參數(shù)的宏定義的一般形式為

參數(shù)表由一個(gè)或多個(gè)參數(shù)構(gòu)成,參數(shù)只有參數(shù)名,沒有數(shù)據(jù)類型符,參數(shù)之間用逗號(hào)隔開,參數(shù)名必須是合法的標(biāo)識(shí)符。參數(shù)列表類似函數(shù)的形參表。預(yù)編譯器首先將實(shí)參按參數(shù)列表中參數(shù)對應(yīng)的順序,取代內(nèi)容文本中的參數(shù);再將這個(gè)宏的實(shí)際內(nèi)容文本替換源程序中的宏標(biāo)識(shí)符:#define標(biāo)識(shí)符(參數(shù)列表)單詞串

源程序#defineMAX(x,y)(((x)>(y))?(x):(y))voidmain(){floata=-2.5,b=-3.2;cout<<MAX(a,b)<<endl;}123456預(yù)編譯處理(宏替換)后的新源程序

intmain(){floata=2.5,b=-3.2;cout<<(((a)>(b))?(a):(b))<<endl;return0;}1234567說明:

預(yù)編譯器在處理上面源程序中的MAX(a,b)時(shí),首先將MAX(x,y)的宏內(nèi)容文本中的x替換成a,將y替換成b,形成新的宏內(nèi)容是:(((a)>(b))?(a):(b)),然后將MAX(a,b)替換成(((a)>(b))?(a):(b))。4.3程序的文件結(jié)構(gòu)與編譯預(yù)處理命令4.3.4.條件編譯

一般情況下,源程序中所有的語句都參加編譯,但有時(shí)也希望根據(jù)一定的條件去編譯源文件的不同部分,這就是條件編譯。條件編譯使得同一源程序在不同的編譯條件下得到不同的目標(biāo)代碼。條件編譯有幾種常用的形式,現(xiàn)分別介紹如下:

(1)#if~#endif形式

#if~

#endif形式的條件編譯的格式為:

其中:elif是elseif的縮寫,但不可寫成elseif。#elif和#else可以省略,但#endif不能省略,它是#if命令的結(jié)尾。#elif命令可以有多個(gè)。if后面的條件必須是一個(gè)常量表達(dá)式,通常會(huì)用到宏名,條件可以不加括號(hào)()

#if條件1

程序段1#elif條件2

程序段2...#else

程序段n#endif

源程序#defineUSA0#defineCHINA1#defineENGLAND2#defineACTIVE_COUNTRYUSA#ifACTIVE_COUNTRY==USAchar*currency="dollar";

#elifACTIVE_COUNTRY==ENGLANDchar*currency="pound";#elsechar*currency="yuan";#endifintmain(){floatmoney;cin>>money;cout<<money<<currency<<endl;return0;}12345678910111213141516171819預(yù)編譯處理后的新源程序

char*currency="dollar";

intmain(){floatmoney;cin>>money;cout<<money<<currency<<endl;return0;}123456789101112131415161718注意:#if和#elif常常與defined命令配合使用4.3程序的文件結(jié)構(gòu)與編譯預(yù)處理命令(2)#ifdef~

#endif

#ifdef~#endif形式的條件編譯的格式為:其中:#else可以省略,#endif不能省略,它是#if命令的結(jié)尾。在#ifdef和#else之間可以加多個(gè)#elif命令?!?ifdef宏名”的含義是判斷是否定義了宏,它等價(jià)于“#ifdefined(宏名)”。其作用是:如果宏名已被#define行定義,則編譯程序段1,否則編譯程序段2。

#ifdef宏名

程序段1#else

程序段2#endif4.3程序的文件結(jié)構(gòu)與編譯預(yù)處理命令(3)#ifndef~

#endif

#ifndef~#endif形式的條件編譯的格式為:條件編譯呢主要用于下列幾種場合:

(1)

避免重復(fù)包含引起變量函數(shù)的重復(fù)定義引起的沖突。如果某個(gè)程序的頭文件中已定義了某個(gè)常量,用條件編譯進(jìn)行判斷后,就不再重新定義該常量,避免造成不一致;如果在頭文件中如果包含某個(gè)模塊,用條件編譯進(jìn)行判斷后,就可不再重復(fù)包含此模塊,避免變量、函數(shù)重名沖突。

#ifndef宏名

程序段1#else

程序段2#endif注意:

與第2種形式的區(qū)別僅在于:如果宏名沒有被#define定義,則編譯程序段1,否則編譯程序段2。

源程序/****************************mymath.h*****************************/#include<iostream>usingnamespacestd;#defineINTMAXintmax(intx,inty){returnx>y?x:y;}/************************主程序************************/#include<iostream>usingnamespacestd;#include"mymath.h"#ifndefINTMAXintmax(intx,inty){returnx>y?x:y;}#endifintmain(){cout<<max(5,6)<<endl;return0;}123456789101112131415161718192021222324252627預(yù)編譯處理后的新源程序

#include<iostream>usingnamespacestd;#include<iostream>usingnamespacestd;#defineINTMAXintmax(intx,inty){returnx>y?x:y;}intmain(){cout<<max(5,6)<<endl;return0;}

解釋:主程序中定義的intmax(int,int)在預(yù)處理時(shí)被過濾掉,沒有進(jìn)入編譯,避免了與mymath.h中的intmax(int,int)沖突。12345678910111213144.3程序的文件結(jié)構(gòu)與編譯預(yù)處理命令

(2)便于程序的移植。如在PC機(jī)上,最常用的C++有BC++、VC++、LinuxGNUC++,三者在實(shí)現(xiàn)上有一些不同之處,如果我們希望自己的源程序能夠適應(yīng)這種差異,可以在有差異的地方插入選擇判斷:#ifdefVC++…//visualC++獨(dú)有的內(nèi)容

#endif#ifdefBC++…//BorlandC++獨(dú)有的內(nèi)容

#endif#ifdefGC++…//LinuxGnuC++獨(dú)有的內(nèi)容

#endif

如果希望這個(gè)程序在BorlandC++環(huán)境下編譯運(yùn)行,可在程序的前面寫上:

#defineBC++

這樣一個(gè)源程序只要修改一句就可以適應(yīng)三種C編譯,商業(yè)軟件經(jīng)常就是這樣編寫的。商業(yè)軟件的版本中經(jīng)常出現(xiàn)的單機(jī)版、網(wǎng)絡(luò)版,其實(shí)網(wǎng)絡(luò)版只是在單機(jī)版的基礎(chǔ)上增加了相應(yīng)的一些網(wǎng)絡(luò)功能,功能上大體相同,所以在同一軟件程序中將單機(jī)版的功能和網(wǎng)絡(luò)版的功能通過條件編譯就可得到相應(yīng)的版本。4.4名字空間

一個(gè)軟件往往由多個(gè)模塊(組件)組成,這些模塊由不同程序員(軟件商)提供,不同模塊可能使用了相同的標(biāo)識(shí)符。簡單說就是同一個(gè)名字在不同模塊中代表不同的事物。當(dāng)這些模塊用到同一個(gè)程序中,同名標(biāo)識(shí)符就引起沖突。C++提供名字空間(namespace)

將相同的名字放在不同空間中來防止命名沖突。

定義一個(gè)名字空間的格式如下:其中:namespace為關(guān)鍵字。名稱為名字空間標(biāo)識(shí)符。成員為函數(shù)、變量、常量、自定義類型等。

namespace名稱

{

成員;

}4.4名字空間例如:一個(gè)名為TsingHua的軟件公司為自己的組件建立了一個(gè)名字空間。將它存入頭文件:TsingHua.h/*************TsingHua.h**********/namespaceTsingHua{intyear=2009;charname[]="TsingHuaSoftware";ShowName(){

cout<<name<<""<<year<<endl;}}4.4名字空間(1)個(gè)別使用聲明方式,格式如下:

其中:::為作用域分辨符。成員使用形式包括函數(shù)調(diào)用式、變量名、常量名、類型名等名字空間名::成員使用形式/******************************p4_6.cpp**名字空間

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論