Was bedeutet?


92

Ich habe 2 Klassen:

class base {
    virtual void foo() {};
};

class derived : public base {
    void foo() { base::foo(); }
};

Ich habe einen Fehler gemacht und base:foo();stattdessen geschrieben base::foo();. Der Code wurde kompiliert und ausgeführt, aber fehlerhaft.

Ich weiß nicht, wie ich es googeln kann und weiß nicht, was es ist, aber ich bin sehr interessiert: Was bedeutet das?

base:foo();

Falls es wichtig ist:

class base : public QAbstractGraphicsShapeItem

32
Es ist ein Etikett .
Chris

20
Dies ist ein Fall, in dem das Einschalten von Warnungen hilft, es live zu sehen ... warning: label 'base' defined but not used [-Wunused-label]... vielleicht müssen wir diese Frage-Seite hinzufügen: Haben Sie versucht, Warnungen
einzuschalten

6
Das endete mit einem Stapelüberlauf. Wie passend!
Laurent LA RIZZA

Antworten:


125
void foo() { base:foo(); }

ist äquivalent zu:

void foo()
{
   base: // An unused label.
   foo(); // Calls the function again, resulting in infinite recursion.
}

Aufgrund der unendlichen Rekursion verursacht die Funktion einen Stapelüberlauf.


1
Ja, ich habe diesen Fehler gefunden, als ich viele Aufrufe foo()im Aufrufstapel gesehen habe. danke
railmisaka

Gibt es dafür Warnungen in gcc / clang etc.?
Nonsensation

10
@Serthy, Wenn ich benutze -Wall, erhalte ich die Warnmeldung: socc.cc:3:4: Warnung: Label 'base' definiert, aber nicht verwendet [-Wunused-label] base: // Ein nicht verwendetes Label.
R Sahu

10
@Serthy: IIRC Visual Studio hat hierfür die Warnung "rekursiv auf allen Steuerpfaden".
MSalters
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.