2012-06-12 108 views
3

我最近遇到了一個C源代碼,其中函數名有時在頭文件中有時多次聲明,有時在C文件中聲明。我知道通過多次聲明函數並沒有錯,但我的問題是爲什麼我們應該多次聲明一個函數?聲明函數次數

+0

顯示出處,否則我們只能猜測作者的意圖。 – tbert

+0

@tbert我希望我能擁有。但它非常巨大。它是一個正常的函數聲明。 – Shash

回答

2

我們不應該。糟糕的編碼。所有這些聲明必須匹配,否則會出現編譯錯誤。

0

可以想象,一些聲明可能是內部條件定義塊,並用不同的情況下:

#ifdef USE_ALT_FUNCS 
    myfunc(type1 t); 
#else 
    myfunc(type2 t); 
#endif 

但如此它仍然不是一個好主意,這將是一個維護頭痛。

0

我不確定但是,也許他們多次聲明該函數,因爲它們使用運算符的重載,多態性或方法的重載。 我認爲你的情況是方法的重載或操作的重載。

對不起,我認爲正確的名稱是「函數重載」。 我希望我能幫助你,但如果你向我們展示一個我們可以看到它的例子,我認爲它會更好。

+2

問題是關於C,而不是C++。 C. –

+0

確實沒有超載,對不起,但我認爲它可以幫助他。我應該刪除我的答案嗎? –

0

有時,由於一些微妙的副作用,重新聲明(或重新定義)函數是有用的。示例here在最後一段中涉及內聯函數。

0

在函數返回非int值(例如double)的情況下,調用函數必須知道被調用函數的返回類型。否則,假設返回類型爲int,但這可能導致信息可能丟失(例如,double到int)。

防止這種信息丟失的一種方法是在調用例程中顯式聲明函數。這可能會解釋爲什麼你注意到同一個函數的很多聲明。

0

我在那裏,我第一次在聲明函數作爲佔位符的情況下,後來與附帶的代碼:

int mouse[2]; 
void doit(); 
void submouse(int btn, int state, int x, int y){ 
    mouse[0] = x; 
    mouse[1] = y; 
    doit(); 
} 
void newwindow(){ 
    subWindow[1][0] = glutCreateSubWindow(mainWindow, 10, 10, 616, 274); 
    windowlevel = 1; 
    glutMouseFunc(submouse); 
} 
void doit(){ 
    // if subwindow has not been created, create subwindow 
    if(windowlevel == 0)newwindow(); 
    else{ //process whatever the mouse clicked 
    } 
} 

這爲使用gcc 4在過去一年的工作:4.8.2-4上我的AMD64的機器,但我得到一個錯誤信息使用gcc 4我的i686機器(Debian的穩定)上:4.7.2-1:

塊引用

program.c:4418:6: error: static declaration of ‘doit’ follows non-static declaration 
program.c:3745:6: note: previous declaration of ‘doit’ was here 

doit()被聲明爲佔位符,因爲它被submouse()調用。 submouse()被聲明爲與newwindow()創建的子窗口關聯。 doit()的代碼直到聲明newwindow()後才被包含,因爲doit()調用newwindow()。 注意:doit()是一個狀態函數。子窗口構建完成後,它會消失,直到它被submouse()調用。