Що означає?


92

У мене є 2 класи:

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

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

Я помилився і написав base:foo();замість base::foo();. Код був скомпільований і запущений, але з сегментами.

Я не знаю, як я можу це погуглити і не знаю, що це таке, але мені дуже цікаво: що це означає?

base:foo();

Якщо це важливо:

class base : public QAbstractGraphicsShapeItem


20
Це випадок, коли ввімкнення попереджень допомагає, перегляньте його в прямому ефірі ... warning: label 'base' defined but not used [-Wunused-label]... можливо, нам потрібно додати це, задайте сторінку запитань: Чи пробували ви
вмикати

6
Це закінчилося переповненням стека. Як це доречно!
Laurent LA RIZZA

Відповіді:


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

еквівалентно:

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

Через нескінченну рекурсію функція викликає переповнення стека.


1
так, я виявив цю помилку, коли побачив багато дзвінків foo()у стек дзвінків. спасибі
railmisaka

чи є попередження щодо цього у gcc / clang тощо?
безглуздість

10
@Serthy, Коли я використовую -Wall, я отримую попереджувальне повідомлення: socc.cc:3:4: warning: label 'base' визначено, але не використовується [-Wunused-label] base: // Невикористана мітка.
Р Саху

10
@Serthy: IIRC Visual Studio має попередження "рекурсивно на всіх контрольних шляхах" для цього.
MSalters
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.