我最近遇到了一个C源代码,其中函数名称有时在头文件中多次声明,有时在C文件中。我知道通过多次声明函数没有错,但我的问题是为什么我们应该多次声明一个函数?
答案 0 :(得分:2)
我们不应该。编码不好。所有这些声明必须匹配,否则会出现编译错误。
答案 1 :(得分:0)
可以想象,一些声明可能在条件定义块内,并在不同情况下使用:
#ifdef USE_ALT_FUNCS
myfunc(type1 t);
#else
myfunc(type2 t);
#endif
但这对维护很头疼,所以它仍然不是一个好主意。
答案 2 :(得分:0)
我不确定但是,也许他们多次声明该函数,因为它们使用运算符的重载,多态性或方法的重载。 我认为在你的情况下是方法过载或操作过载。
对不起我的英文我认为正确的名称是“功能重载”。 我希望我可以帮助你,但如果你向我们展示一个我们可以看到它的例子,我认为会更好。
答案 3 :(得分:0)
由于某些微妙的副作用,有时重新声明(或重新定义)一个函数是有用的。在最后一段中,有一个例子显示here,涉及内联函数。
答案 4 :(得分:0)
如果函数返回非int值(例如double),则调用函数必须知道被调用函数的返回类型。否则假定返回类型为int,但这可能导致可能的信息丢失(例如,double到int)。
防止这种信息丢失的一种方法是在调用例程中显式声明该函数。这可以解释为什么你注意到同样功能的声明很多。
答案 5 :(得分: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
}
}
在我的AMD64机器上使用gcc 4:4.8.2-4过去一年有效,但是我的i686机器(Debian stable)使用gcc 4: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()创建的子窗口关联。 直到newwindow()声明之后才会包含doit()的代码,因为doit()调用newwindow()。 注意:doit()是一个状态函数。构建子窗口后,它会一直消失,直到被submouse()调用。