簡(jiǎn)單講解C++的內(nèi)部和外部函數(shù)以及宏的定義
C++內(nèi)部函數(shù)和外部函數(shù)
函數(shù)本質(zhì)上是全局的,因?yàn)橐粋€(gè)函數(shù)要被另外的函數(shù)調(diào)用,但是,也可以指定函數(shù)只能被本文件調(diào)用,而不能被其他文件調(diào)用。根據(jù)函數(shù)能否被其他源文件調(diào)用,將函數(shù)區(qū)分為內(nèi)部函數(shù)和外部函數(shù)。
內(nèi)部函數(shù)
如果一個(gè)函數(shù)只能被本文件中其他函數(shù)所調(diào)用,它稱為內(nèi)部函數(shù)。在定義內(nèi)部函數(shù)時(shí),在函數(shù)名和函數(shù)類型的前面加static。函數(shù)首部的一般格式為:
static 類型標(biāo)識(shí)符 函數(shù)名(形參表);
如
static int fun(int a, int b);
內(nèi)部函數(shù)又稱靜態(tài)(static)函數(shù)。使用內(nèi)部函數(shù),可以使函數(shù)只局限于所在文件。如果在不同的文件中有同名的內(nèi)部函數(shù),互不干擾。通常把只能由同一文件使用的函數(shù)和外部變量放在一個(gè)文件中,在它們前面都冠以static使之局部化,其他文件不能引用。
外部函數(shù)
在定義函數(shù)時(shí),如果在函數(shù)首部的最左端冠以關(guān)鍵字extern,則表示此函數(shù)是外部函數(shù),可供其他文件調(diào)用。如函數(shù)首部可以寫為:
extern int fun (int a, int b);
這樣,函數(shù)fun就可以為其他文件調(diào)用。如果在定義函數(shù)時(shí)省略extern,則默認(rèn)為外部函數(shù)。本教程前面所用的函數(shù)都是外部函數(shù)。
在需要調(diào)用此函數(shù)的文件中,用extern聲明所用的函數(shù)是外部函數(shù)。
【例】輸入兩個(gè)整數(shù),要求輸出其中的大者,用外部函數(shù)實(shí)現(xiàn)。
/*******file1.cpp(文件1)*******/ #include <iostream> using namespace std; int main( ) { extern int max(int,int); //聲明在本函數(shù)中將要調(diào)用在其他文件中定義的max函數(shù) int a,b; cin>>a>>b; cout<<max(a,b)<<endl; return 0; } /*******file2.cpp(文件2)*******/ int max(int x,int y) { int z; z=x>y?x:y; return z; }
運(yùn)行情況如下:
7 -34↙ 7
在計(jì)算機(jī)上運(yùn)行一個(gè)含多文件的程序時(shí),需要建立一個(gè)項(xiàng)目文件(project file),在該項(xiàng)目文件中包含程序的各個(gè)文件。詳細(xì)情況請(qǐng)查看:VC6.0使用教程。
通過此例可知:使用extern聲明就能夠在一個(gè)文件中調(diào)用其他文件中定義的函數(shù),或者說把該函數(shù)的作用域擴(kuò)展到本文件。extern聲明的形式就是在函數(shù)原型基礎(chǔ)上加關(guān)鍵字extern。由于函數(shù)在本質(zhì)上是外部的,在程序中經(jīng)常要調(diào)用其他文件中的外部函數(shù),為方便編程,C++允許在聲明函數(shù)時(shí)省寫extern。例4.15程序main函數(shù)中的函數(shù)聲明可寫成:
int max(int, int);
這就是我們多次用過的函數(shù)原型。由此可以進(jìn)一步理解函數(shù)原型的作用。用函數(shù)原型能夠把函數(shù)的作用域擴(kuò)展到定義該函數(shù)的文件之外(不必使用extern)。只要在使用該函數(shù)的每一個(gè)文件中包含該函數(shù)的函數(shù)原型即可。函數(shù)原型通知編譯系統(tǒng):該函數(shù)在本文件中稍后定義,或在另一文件中定義。
利用函數(shù)原型擴(kuò)展函數(shù)作用域最常見的例子是#include命令的應(yīng)用。在#include命令所指定的頭文件中包含有調(diào)用庫函數(shù)時(shí)所需的信息。例如,在程序中需要調(diào)用sin函數(shù),但三角函數(shù)并不是由用戶在本文件中定義的,而是存放在數(shù)學(xué)函數(shù)庫中的。按以上的介紹,必須在本文件中寫出sin函數(shù)的原型,否則無法調(diào)用sin函數(shù)。sin函數(shù)的原型是:
double sin(double x);
本來應(yīng)該由程序設(shè)計(jì)者在調(diào)用庫函數(shù)時(shí)先從手冊(cè)中查出所用的庫函數(shù)的原型,并在程序中一一寫出來,但這顯然是麻煩而困難的。為減少程序設(shè)計(jì)者的困難,在頭文件cmath中包括了所有數(shù)學(xué)函數(shù)的原型和其他有關(guān)信息,用戶只需用以下#include命令:
#include <cmath>
即可。這時(shí),在該文件中就能合法地調(diào)用各數(shù)學(xué)庫函數(shù)了。
C++宏定義#define
可以用#define命令將一個(gè)指定的標(biāo)識(shí)符(即宏名)來代表一個(gè)字符串。定義宏的作用一般是用一個(gè)短的名字代表一個(gè)長的字符串。它的一般形式為:
#define 標(biāo)識(shí)符 字符串
這就是已經(jīng)介紹過的定義符號(hào)常量。如:
#define PI 3.1415926
還可以用#define命令定義帶參數(shù)的宏定義。其定義的一般形式為:
#define 宏名(參數(shù)表) 字符串
如:
#define S(a, b) a*b //定義宏S(矩形面積),a、b為宏的參數(shù)
使用的形式如下:
area=S(3, 2);
用3、2分別代替宏定義中的形式參數(shù)a和b,即用3*2代替S(3, 2)。因此賦值語句展開為:
area=3*2;
由于C++增加了內(nèi)置函數(shù)(inline),比用帶參數(shù)的宏定義更方便,因此在C++中基本上已不再用#define命令定義宏了,主要用于條件編譯中。
相關(guān)文章
Matlab實(shí)現(xiàn)多子圖同步調(diào)整視角
這篇文章主要為大家介紹了如何利用Matlab實(shí)現(xiàn)多子圖同步調(diào)整視角,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定幫助,需要的可以參考一下2022-03-03C語言驅(qū)動(dòng)開發(fā)之內(nèi)核通過PEB獲取進(jìn)程參數(shù)
PEB結(jié)構(gòu)(Process Envirorment Block Structure)其中文名是進(jìn)程環(huán)境塊信息。本文將通過PEB實(shí)現(xiàn)獲取進(jìn)程參數(shù),感興趣的小伙伴可以了解一下2022-10-10C++實(shí)現(xiàn)和電腦對(duì)戰(zhàn)三子棋實(shí)例
大家好,本篇文章主要講的是C++實(shí)現(xiàn)和電腦對(duì)戰(zhàn)三子棋實(shí)例,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01C++對(duì)string進(jìn)行大小寫轉(zhuǎn)換操作方法
這篇文章主要介紹了C++對(duì)string進(jìn)行大小寫轉(zhuǎn)換操作方法,本文通過兩種方法結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02深入探討:main函數(shù)執(zhí)行完畢后,是否可能會(huì)再執(zhí)行一段代碼?
本篇文章是對(duì)main函數(shù)執(zhí)行完畢后,是否可能會(huì)再執(zhí)行一段代碼,進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05