2012-06-12 117 views
3

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

+0

显示出处,否则我们只能猜测作者的意图。 – tbert

+0

@tbert我希望我能拥有。但它非常巨大。它是一个正常的函数声明。 – Shash

回答

2

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

0

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

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

但如此它仍然不是一个好主意,这将是一个维护头痛。

0

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

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

+2

问题是关于C,而不是C++。 C. –

+0

确实没有超载,对不起,但我认为它可以帮助他。我应该删除我的答案吗? –

0

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

0

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

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

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 
    } 
} 

这为使用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()调用。