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