我最近遇到了一个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