2013-04-25 6 views
10

Kann mir bitte jemand sagen, ob es akzeptabel ist, dieselben goto-Beschriftungen in verschiedenen Funktionen in derselben C-Datei zu verwenden?Gleiche Sprungmarken in einer C-Datei, aber verschiedene Funktionen

Um zu erklären, was ich bin vor:

function1() 
{ 
    ... 

    goto label 

    ... 

label: 
    ... 
} 

function2() 
{ 
    ... 

    goto label; 

    ... 

label: 
    ... 
} 

Jetzt was passiert ist, dass der Code nach dem Etikett für die Bereinigung von malloc'ed‘Daten verwendet wird. Und das Ganze stürzt in Funktion2 ab. Ich habe das Mem ausgedruckt. Orte, die frei und gleich sind, werden mehrfach freigelassen. Ist das wegen all der Gotos? Ist das eine gültige Verwendung der goto-Anweisung?

+1

Formatieren Sie bitte Ihre Frage richtig. – Alex

+0

versuchen, einen Code für das eigentliche Problem zu posten ... – akp

+0

Sie können die gleichen Namen in verschiedenen Funktionen haben, aber Sie können nicht * Label verwenden, das in einer anderen Funktion ist. Ihr Absturz hat nichts damit zu tun, dass der Markenname wiederverwendet wird. Es ist etwas anderes in Ihrem Code falsch, das das doppelte frei verursacht. –

Antwort

15

Etiketten sind lokal, Sie können also das gleiche Etikett in mehreren Funktionen verwenden.

Die Frage, ob Sie goto verwenden sollten, ist eine andere Sache, und eine, die nicht leicht zu beantworten ist. Kurz gesagt, verwenden Sie nicht goto. Aber wie bei allem (besonders bei der Programmierung) gibt es Ausnahmen, bei denen goto nützlich sein kann.

+8

Und die Verwendung von goto für Aufräumen neigt dazu, einer von ihnen zu sein. – Medinoc

+1

goto wird sehr häufig verwendet, wenn der Aufbau/Abbau komplex ist (z. B. Linux Kernel) und verschiedene Exit-Bedingungen den Code von anderen wiederverwenden (zB Ressourcen zuweisen/freigeben). In diesen Fällen ist die Verwendung von goto sauberer und stellt sicher, dass der Fall-Through-Mechanismus genau die gleiche Sequenz über verschiedene Stadien des Abbaus durchführt. –

5

Wie Joachim hier sagte, sind die Etiketten lokal; Beachten Sie jedoch, dass Beschriftungen für Funktionen lokal sind - nicht für den aktuellen Block. goto Die Anweisungen berücksichtigen die Festlegung des Gültigkeitsbereichs nicht, mit Ausnahme des Scopings für die gesamte Funktion.

Verwandte Themen