2010-03-20 27 views
5

He encontrado el siguiente código, y como principiante en C, vine aquí por su ayuda.¿Declarar una función dentro de una función?

Esta función es de una implementación de una cola.

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

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

    //do stuff 

    return true; 
} 

Por lo tanto, estoy recibiendo un error extraño con gcc en el pitido nulo(). ¿Puede alguien por favor explicarme qué es esto, declarar una función dentro de una función? ¿O es el sonido vacío() simplemente fuera de lugar? Me dieron este código y siempre existe la posibilidad de que no sea correcto.

Editar: El error que estoy recibiendo:

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

¿Es esto un error al vincular?

+0

¿Qué error? ___ – kennytm

+1

Sí, es un error de enlace. No solo tiene que declarar cada función que usa, sino que también debe definirlas todas o vincularlas con las bibliotecas que definen las funciones. Como sus bibliotecas no definen 'beep()', debe hacerlo. –

+1

Y, como regla general, las funciones deben declararse en los encabezados y los encabezados utilizados; declarar una función dentro de otra como esa es una receta para problemas de mantenimiento posteriores. –

Respuesta

4

Lo más probable es que están teniendo un error de vinculación porque:

void beep(); 

es un prototipo de una función que tiene que ser definida en otro lugar. En C no puede definir una función dentro de otra. Por favor, elabore sobre el error que está recibiendo.

+0

He definido una función dentro de otra antes. Tuve que moverlo al exterior por otros motivos, pero es posible, al menos con gcc. –

+1

@Ignacio OK, pero eso es una extensión de GCC^_ ^ – AraK

3

Esto es inusual pero legal. El error que está viendo podría ser del enlazador, si no existe un beep() definido en otro lugar. ¿Puedes publicar el error real que recibes?

1

Como otros han notado lo que sucede aquí es que su función está declarando un prototipo para una función llamada "beep". La forma de evitar esto es asegurarse de que el pitido de la función esté incluido en su compilación o enlace.

El primer paso es asegurarse de que se está compilando todos los archivos que ha recibido y la vinculación de todos los de la Lib apoyado

Si esto no funciona, puede simplemente añadir el método mismo;)

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