首先讓我們看一段代碼:
int main()
{
std::cout << "The sum of 3 and 4 is: " << add(3, 4) << std::endl;
return 0;
}
int add(int x, int y)
{
return x + y;
}
你希望得到的結(jié)果是:The sum of 3 and 4 is: 7
,但是事實(shí)上侵俗,它不會(huì)被編譯通過(guò)。在XCode里你會(huì)看到這樣的錯(cuò)誤:Use of undeclared identifier 'add'
增拥。
為什么會(huì)出現(xiàn)這樣的錯(cuò)誤呢寻歧?
原因是這樣的:解析器是順序讀取文件的,也就是說(shuō)猾封,解析器會(huì)從上到下一行行的解析代碼噪珊,當(dāng)解析器讀到add()這個(gè)函數(shù)的時(shí)候齐莲,我們還沒(méi)有定義add()這個(gè)函數(shù)选酗,所以解析器并不知道add是什么搀捷。
怎么解決這個(gè)問(wèn)題呢多望?
一般來(lái)說(shuō),有兩種辦法解決上面的問(wèn)題:
-
方法一 在main()之前定義add()函數(shù)家厌,也就是說(shuō)在調(diào)用add()的時(shí)候椎工,mian()已經(jīng)知道它是什么了维蒙。
int add(int x, int y)
{
return x + y;
}
int main()
{
std::cout << "The sum of 3 and 4 is: " << add(3, 4) << std::endl;
return 0;
}
這種解決辦法比較簡(jiǎn)單,但是我們?cè)囅胍幌拢喝绻覀儗懥藘蓚€(gè)函數(shù)A和B殖熟,并且A函數(shù)調(diào)用了B函數(shù)斑响,同時(shí)B函數(shù)也調(diào)用了A函數(shù),這種情況下到底誰(shuí)定義在前面就比較尷尬了纽门,先定義A函數(shù)营罢,解析器就不知道B是什么,同樣先定義B函數(shù)蝙搔,解析器也不知道A是什么能颁,那到底應(yīng)該怎么做呢伙菊?讓我們接著往下看敌土。
-
方法二 使用前向聲明
前向聲明允許我們告訴解析器在函數(shù)定義函數(shù)體之前確定它的存在运翼。
我們?cè)趺礊楹瘮?shù)寫一個(gè)前向聲明呢血淌?要想寫一個(gè)前向聲明,我們使用一個(gè)叫做函數(shù)原型的東西悠夯。那什么又是函數(shù)原型呢沦补?函數(shù)原型由函數(shù)的返回值,函數(shù)名虚倒,以及形參構(gòu)成产舞,但是并不包括函數(shù)體(也就是花括號(hào)里面那一部分),因?yàn)楹瘮?shù)原型是一個(gè)聲明耻煤,所以要以分號(hào)結(jié)束擦囊。
int add(int x, int y); // add()函數(shù)的前向聲明(使用了函數(shù)原型)
int main()
{
std::cout << "The sum of 3 and 4 is: " << add(3, 4) << std::endl; // 因?yàn)樯厦媲跋蚵暶髁薬dd()瞬场,所以這里不會(huì)報(bào)錯(cuò)。
return 0;
}
int add(int x, int y) //盡管add()函數(shù)體到這里才被定義眼五。
{
return x + y;
}