क्या मतलब है?


92

मेरी 2 कक्षाएं हैं:

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

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

मैंने गलती की और base:foo();इसके बजाय लिखा base::foo();। कोड संकलित और चलाया गया था, लेकिन segfaulted।

मुझे नहीं पता कि मैं इसे कैसे Google कर सकता हूं और यह नहीं जानता कि यह क्या है, लेकिन मुझे बहुत दिलचस्पी है: इसका क्या मतलब है?

base:foo();

यदि यह महत्वपूर्ण है:

class base : public QAbstractGraphicsShapeItem

32
यह एक लेबल है
क्रिस

20
यह एक ऐसा मामला है जहां चेतावनी को चालू करने से मदद मिलती है, इसे लाइव देखें ... warning: label 'base' defined but not used [-Wunused-label]... शायद हमें इसे एक प्रश्न पृष्ठ में जोड़ने की आवश्यकता है: क्या आपने चेतावनियों को चालू करने की कोशिश की है
शफीक यघमौर

6
यह एक ढेर अतिप्रवाह के साथ समाप्त हुआ। कितना उचित है!
लॉरेंट ला रिज़्ज़ा

जवाबों:


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

के बराबर है:

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

अनंत पुनरावृत्ति के कारण, फ़ंक्शन स्टैक ओवरफ़्लो का कारण बनता है।


1
हां, मैंने उस गलती को पाया जब मैंने foo()कॉल स्टैक में कई कॉल देखे । धन्यवाद
रेलमिसका

क्या इसके लिए gcc / clang इत्यादि में उपलब्ध चेतावनी है?
बकवास

10
@Serthy, जब मैं उपयोग करता हूं, तो मुझे -Wallचेतावनी संदेश मिलता है: socc.cc:3:4: चेतावनी: लेबल 'आधार' परिभाषित है, लेकिन इसका उपयोग नहीं किया जाता है [-Wunused-label] आधार: // एक अप्रयुक्त लेबल।
आर साहू

10
@Serthy: IIRC विजुअल स्टूडियो ने इसके लिए "सभी नियंत्रण मार्गों पर पुनरावर्ती" चेतावनी दी है।
MSalters
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.