声明函数次数

时间:2012-06-12 08:30:25

标签: c function

我最近遇到了一个C源代码,其中函数名称有时在头文件中多次声明,有时在C文件中。我知道通过多次声明函数没有错,但我的问题是为什么我们应该多次声明一个函数?

6 个答案:

答案 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()调用。