我最近遇到了一個C源代碼,其中函數名有時在頭文件中有時多次聲明,有時在C文件中聲明。我知道通過多次聲明函數並沒有錯,但我的問題是爲什麼我們應該多次聲明一個函數?聲明函數次數
聲明函數次數
回答
我們不應該。糟糕的編碼。所有這些聲明必須匹配,否則會出現編譯錯誤。
可以想象,一些聲明可能是內部條件定義塊,並用不同的情況下:
#ifdef USE_ALT_FUNCS
myfunc(type1 t);
#else
myfunc(type2 t);
#endif
但如此它仍然不是一個好主意,這將是一個維護頭痛。
我不確定但是,也許他們多次聲明該函數,因爲它們使用運算符的重載,多態性或方法的重載。 我認爲你的情況是方法的重載或操作的重載。
對不起,我認爲正確的名稱是「函數重載」。 我希望我能幫助你,但如果你向我們展示一個我們可以看到它的例子,我認爲它會更好。
問題是關於C,而不是C++。 C. –
確實沒有超載,對不起,但我認爲它可以幫助他。我應該刪除我的答案嗎? –
有時,由於一些微妙的副作用,重新聲明(或重新定義)函數是有用的。示例here在最後一段中涉及內聯函數。
在函數返回非int值(例如double)的情況下,調用函數必須知道被調用函數的返回類型。否則,假設返回類型爲int,但這可能導致信息可能丟失(例如,double到int)。
防止這種信息丟失的一種方法是在調用例程中顯式聲明函數。這可能會解釋爲什麼你注意到同一個函數的很多聲明。
我在那裏,我第一次在聲明函數作爲佔位符的情況下,後來與附帶的代碼:
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()調用。
- 1. 函數聲明
- 2. 聲明函數
- 3. 聲明函數
- 4. JS函數聲明:在參數聲明
- 5. 爲什麼這個函數聲明兩次?回調函數在哪裏聲明?
- 6. 爲閉包聲明兩次函數?
- 7. 聲明函數AddPrinterConnection要運行多次
- 8. PLSQL函數聲明
- 9. C++函數聲明
- 10. jQuery函數聲明
- 11. 函數的聲明
- 12. GetClipboardSequenceNumber()函數聲明
- 13. 聲明session_start()函數?
- 14. Lua函數聲明
- 15. (Z3Py)聲明函數
- 16. jQuery函數聲明說明
- 17. 函數參數聲明
- 18. JavaScript函數參數聲明
- 19. 非成員函數可以多次聲明,而成員函數只能聲明一次?
- 20. 函數聲明使用perl函數指針聲明
- 21. 聲明數組兩次(C99)
- 22. 函數內函數內聲明
- 23. 函數聲明或函數表達式
- 24. 函數內聲明函數的範圍
- 25. (函數(){})()聲明/初始化JavaScript函數
- 26. 函數定義中的函數聲明
- 27. 函數定義聲明函數嗎?
- 28. 預期的函數體函數聲明
- 29. Variadic函數聲明VS函數列表
- 30. 函數聲明/函數定義
顯示出處,否則我們只能猜測作者的意圖。 – tbert
@tbert我希望我能擁有。但它非常巨大。它是一個正常的函數聲明。 – Shash