1.從C語言的語法設(shè)計(jì)來說是不支持的,早期的C編譯器未考慮過函數(shù)重載這一功能,所以就會有那么多類似的函數(shù)abs,labs,fabs等等(每種類型都要考慮一個不同的函數(shù)名)。
成都創(chuàng)新互聯(lián)致力于互聯(lián)網(wǎng)網(wǎng)站建設(shè)與網(wǎng)站營銷,提供網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、網(wǎng)站開發(fā)、seo優(yōu)化、網(wǎng)站排名、互聯(lián)網(wǎng)營銷、小程序開發(fā)、公眾號商城、等建站開發(fā),成都創(chuàng)新互聯(lián)網(wǎng)站建設(shè)策劃專家,為不同類型的客戶提供良好的互聯(lián)網(wǎng)應(yīng)用定制解決方案,幫助客戶在新的全球化互聯(lián)網(wǎng)環(huán)境中保持優(yōu)勢。
2.C語言標(biāo)準(zhǔn)就規(guī)定不允許同一作用域中兩個函數(shù)重名。和C語言相關(guān)的域有兩種,一個是給編譯器看得,還有一種是給鏈接器看的,而給編譯器看的這種域主要是關(guān)于
變量的可見范圍,而鏈接器看到的那個是叫文件域,而全局域可能要跨越好幾個文件域,這樣只要兩個同名函數(shù)用static修飾,并且在不同的文件中,就不會
沖突。不過這個實(shí)際上已經(jīng)超越了編譯器的范圍,表面看起來兩個函數(shù)同名,但是實(shí)際上編譯器為鏈接器產(chǎn)生是指向的同一個函數(shù)地址。
3.函數(shù)重載是一個編譯期行為,主要是通過name mangling來產(chǎn)生不同的匯編符號,讓linker可以正確的link代碼。
4.但是,C語言作為一個具有超強(qiáng)功能的底層語言,是有辦法進(jìn)行模擬函數(shù)重載的。那就是函數(shù)指針。最簡單的例子就是qsort函數(shù)。這個函數(shù)可以傳遞一個函數(shù)指針變量,通過不同的函數(shù)指針,可以對不同的數(shù)據(jù)類型就行相同的qsort操作,從某種層面來說相當(dāng)于函數(shù)重載。
#includestdio.h
#includestring.h
int main()
{
char str[5];
while(1)
{
printf("[gets]str=");
gets(str);
printf("gets:str:%s,length:%d\n",str,strlen(str));
printf("scanf,str=");
scanf("%s",str);
getchar();
printf("scanf:str=%s\n",str,strlen(str));
if(str[0]=='f') break;
}
return 0;
}
scanf輸入后那個回車被gets(str)接收了,所以下次遇到gets就不再等待你輸入,可以用getchar()把scanf輸入后的回車接收就好了。 我運(yùn)行過的,給最佳答案哦!
若一個程序或子程序可以安全的被并行執(zhí)行,則稱其為可重入(reentrant或re-entrant)的;即,當(dāng)該子程序正在運(yùn)行時,可以再次進(jìn)入并執(zhí)行它。若一個函數(shù)是可重入的,則該函數(shù):不能含有靜態(tài)(全局)非常量數(shù)據(jù)。 不能返回靜態(tài)(全局)非常量數(shù)據(jù)的地址。 只能處理由調(diào)用者提供的數(shù)據(jù)。 不能依賴于單實(shí)例模式資源的鎖。 不能調(diào)用不可重入的函數(shù)。 多'用戶/對象/進(jìn)程優(yōu)先級'以及多進(jìn)程一般會使得對可重入代碼的控制變得復(fù)雜。同時,IO代碼通常不是可重入的,因?yàn)樗麄円蕾囉谙翊疟P這樣共享的、單獨(dú)的資源??芍厝胄允呛瘮?shù)編程語言的關(guān)鍵特性之一。 例子在以下的C語言代碼中,函數(shù)f和函數(shù)g都不是可重入的。int g_var = 1;int f(){ g_var = g_var + 2; return g_var;}int g(){ return f() + 2;}以上代碼中,f使用了全局變量 g_var,所以,如果兩個線程同時執(zhí)行它并訪問g_var,則返回的結(jié)果取決于執(zhí)行的時間。因此,f不可重入。而g調(diào)用了f,所以它也不可重入。稍作修改后,兩個函數(shù)都是可重入的:int f(int i){ return i + 2;}int g(int i){ return f(i) + 2;}