2010-03-20 11 views
5

Ich bin auf den folgenden Code gestoßen, und da ich ein C-Anfänger bin, bin ich für deine Hilfe hierher gekommen.Eine Funktion in einer Funktion deklarieren?

Diese Funktion stammt aus der Implementierung einer Queue.

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

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

    //do stuff 

    return true; 
} 

Also, ich bekomme einen seltsamen Fehler mit GCC auf den void beep(). Kann mir bitte jemand erklären, was das ist, eine Funktion in einer Funktion deklarieren. Oder ist es der leere Piepton() einfach fehl am Platz? Ich habe diesen Code bekommen und es besteht immer die Möglichkeit, dass es nicht korrekt ist.

Edit: Der Fehler Ich erhalte:

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

Ist das ein Verbindungsfehler?

+0

Welcher Fehler? ___ – kennytm

+1

Ja, es ist ein Verknüpfungsfehler. Sie müssen nicht nur jede Funktion, die Sie verwenden, deklarieren - Sie müssen sie auch alle definieren oder mit Bibliotheken verknüpfen, die die Funktionen definieren. Da Ihre Bibliotheken 'beep()' nicht definieren, müssen Sie dies tun. –

+1

Und in der Regel sollten Funktionen in Kopfzeilen und die verwendeten Header deklariert werden; eine Funktion in einem anderen zu deklarieren, ist ein Rezept für spätere Wartungsprobleme. –

Antwort

4

Wahrscheinlich haben Sie eine Verknüpfung Fehler, weil:

void beep(); 

ein Prototyp einer Funktion, die an anderer Stelle definiert werden muss. In C können Sie nicht definieren eine Funktion in einem anderen. Bitte erläutern Sie den Fehler, den Sie bekommen.

+0

Ich habe zuvor eine Funktion innerhalb einer anderen definiert. Ich musste es schließlich aus anderen Gründen verschieben, aber es ist möglich, zumindest mit gcc. –

+1

@Ignacio OK, aber das ist eine GCC-Erweiterung^_ ^ – AraK

3

Dies ist ungewöhnlich, aber legal. Der Fehler, den Sie sehen, stammt möglicherweise vom Linker, wenn kein anderer beep() irgendwo anders definiert ist. Können Sie den tatsächlichen Fehler posten, den Sie erhalten?

1

Wie andere bemerkt haben, ist hier, dass Ihre Funktion einen Prototyp für eine Funktion namens "Beep" deklariert. Um dies zu umgehen, müssen Sie sicherstellen, dass der Funktionssignalton bei der Kompilierung oder Verknüpfung enthalten ist.

Der erste Schritt ist, um sicherzustellen, werden Sie alle Dateien kompilieren Sie empfangen und die Verknüpfung alle unterstützten LIB des

Wenn dies nicht, dass Sie nicht arbeiten können, nur die Methode hinzufügen, selbst;)

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