一直覺(jué)得寫(xiě)了這么久代碼,對(duì)c,或者c++的掌握還算不錯(cuò),可是最近才發(fā)現(xiàn),不了解的細(xì)節(jié)實(shí)在太多了。
比如下面這個(gè)例子:
// 1. c
int print_float(float f)
{
return print("%f\n", f);
}
// 2. c
int main()
{
int a = 1;
print_float(a);
return 0;
}
gcc -c *.c && gcc -o test *.o && ./test
很簡(jiǎn)單的一段代碼,可是打印出來(lái)的結(jié)果卻是:
0.000000
為什么會(huì)出現(xiàn)這樣的結(jié)果?其實(shí)就是題目中說(shuō)道的:c的隱式聲明。
如果沒(méi)有關(guān)于被調(diào)函數(shù)的特定信息,編譯器便假定在這個(gè)函數(shù)的調(diào)用時(shí)傳遞的參數(shù)類型和個(gè)數(shù)都是正確的,同時(shí)會(huì)假定函數(shù)返回一個(gè)整數(shù)類型的值。
但是如果被調(diào)函數(shù)的返回值不是整型,或者實(shí)參與形參不匹配,都將導(dǎo)致函數(shù)調(diào)用出現(xiàn)錯(cuò)誤。
這個(gè)問(wèn)題看似簡(jiǎn)單,卻可以隱藏的非常深,而解決方式也無(wú)非就是秉持一種良好的編程習(xí)慣:
任何時(shí)候,都要聲明函數(shù)。
比如在上面的例子中,只需要在main函數(shù)前面聲明:int print_float(flat f),就可以了。
c和c++中類似這樣的小問(wèn)題,數(shù)不勝數(shù)。看來(lái)永遠(yuǎn)都沒(méi)有精通c++的那一天了,想想都覺(jué)得好傷感。
(原文時(shí)間2014-3-18)