3

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

4

6 回答 6

2

我们不应该。编码不好。所有这些声明都必须匹配,否则会出现编译错误。

于 2012-06-12T08:31:40.000 回答
0

可以想象,一些声明可能在条件定义块内,并在不同的情况下使用:

#ifdef USE_ALT_FUNCS
  myfunc(type1 t);
#else
  myfunc(type2 t);
#endif

但这将是一个令人头疼的维护问题,所以它仍然不是一个好主意。

于 2012-06-12T08:38:20.920 回答
0

我不确定,但也许他们多次声明该函数,因为他们使用运算符重载、多态性或方法重载。我认为在您的情况下是方法重载或操作重载。

对不起我的英语,我认为正确的名称是“函数重载”。我希望我能帮助你,但我认为如果你向我们展示一个我们可以看到的例子会更好。

于 2012-06-12T08:39:31.443 回答
0

有时,由于一些微妙的副作用,重新声明(或重新定义)函数很有用。此处显示了一个示例,在最后一段中,涉及内联函数。

于 2012-06-12T08:51:09.147 回答
0

在函数返回非整数值(例如双精度)的情况下,调用函数必须知道被调用函数的返回类型。否则,假定返回类型为 int,但这可能导致信息丢失(例如 double 到 int)。

防止这种信息丢失的一种方法是在调用例程中显式声明该函数。这也许可以解释为什么你注意到同一个函数有这么多声明。

于 2013-10-02T17:00:16.273 回答
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 一直有效,但我在使用 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() 调用。

于 2014-09-13T01:45:27.027 回答