2010-03-20 51 views
5

我已经跨越了下面的代码来了,是C初学者,我来到这里对您有所帮助。在函数内部声明一个函数?

此功能是从一个队列的一个C implmentation。

Bool queuePut(Queue *q, char c) 
{ 
    void beep(); 

    if (queueFull(q)) 
    { 
     beep(); 
     return false; 
    } 

    //do stuff 

    return true; 
} 

所以,我越来越用gcc一个奇怪的错误就作废了蜂鸣声()。有人可以请解释我是什么,在函数内部声明一个函数。或者它是无效的嘟嘟声()简直不合适?我被给了这个代码,并且总有可能它是不正确的。

编辑:错误我收到:

c:/djgpp/tmp/src/ccrjtmBh.o:queue.c:(.text+0x50): undefined reference to 
    '_beep' 
collect 2: ld returned 1 exit status. 

这是一个链接错误?

+0

什么错误? ___ – kennytm 2010-03-20 19:59:18

+1

是的,这是一个链接错误。你不仅需要声明你使用的每个函数 - 你还必须定义它们,或者链接到定义函数的库。由于你的库没有定义'beep()',所以你必须这样做。 – 2010-03-20 20:15:45

+1

而且,作为一般规则,函数应该在头文件和头文件中声明;在另一个内部声明一个函数就是为了以后的维护问题。 – 2010-03-20 20:16:59

回答

4

最可能的是你有一个链接错误,因为:

void beep(); 

是具有在其他地方定义的函数的原型。在C你不能定义内另外一个功能。请详细说明你遇到的错误。

+0

我已经在另一个之前定义了一个函数。我不得不最终将其移出外部,但至少在gcc的情况下是可能的。 – 2010-03-20 19:59:27

+1

@Ignacio好的,但这是一个GCC扩展^ _ ^ – AraK 2010-03-20 20:00:27

3

这是不寻常的,但合法的。如果在其他地方没有定义实际的beep(),则您看到的错误可能来自链接器。你能发布你收到的实际错误吗?

1

正如其他人指出这是怎么回事的是,你的函数声明为一个名为“嘟嘟”功能的原型。解决此问题的方法是确保在编译或链接中包含函数嘟嘟声。

的第一步是确保你正在编译所有你收到的文件和链接的所有受支持的.lib的

如果这不起作用,你可以只添加你自己的方法)

void beep() { 
    printf ("beep\n"); 
}