मैं वीसी 9 के साथ बनाए गए एप्लिकेशन पर काम कर रहा हूं और मैंने एक चेतावनी पर मारा है जिसे मैं पूरी तरह से समझ नहीं पा रहा हूं: क्यों बंद होने पर "पहुंचने योग्य कोड" चेतावनी है निर्माता?कन्स्ट्रक्टर के बंद ब्रेस पर पहुंचने योग्य कोड
न्यूनतम testcase समस्या को पुनः के लिए है:
__declspec(noreturn) void foo() {
// Do something, then terminate the program
}
struct A {
A() {
foo();
} // d:\foo.cpp(7) : warning C4702: unreachable code
};
int main() {
A a;
}
यह चेतावनी को गति प्रदान करने/W4 साथ संकलित किया जाना चाहिए। वैकल्पिक रूप से, आप इस चेतावनी का पता लगाने पर त्रुटि को बल देने के लिए/we4702 के साथ संकलित कर सकते हैं।
d:\>cl /c /W4 foo.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 15.00.21022.08 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
foo.cpp
d:\foo.cpp(7) : warning C4702: unreachable code
कोई व्याख्या कर सकते हैं क्या, ठीक है, यहाँ तक पहुँचा? मेरा सबसे अच्छा सिद्धांत यह है कि यह विनाशक है, लेकिन मुझे एक निश्चित उत्तर चाहिए।
अगर मैं यह कोड चेतावनी-साफ करना चाहता हूं, तो मैं इसे कैसे प्राप्त कर सकता हूं? सबसे अच्छा मैं साथ आ सकता हूं इसे संकलित-समय त्रुटि में परिवर्तित कर रहा है।
struct A {
private:
A(); // No, you can't construct this!
};
int main() {
A a;
}
संपादित करें: स्पष्टीकरण के लिए, एक noreturn समारोह के साथ कार्यक्रम समाप्त सामान्य रूप से एक नहीं पहुंचा जा सकता कोड समापन ब्रेस enclosing कि समारोह फोन पर चेतावनी का कारण नहीं है। में
__declspec(noreturn) void foo() {
// Do something, then terminate the program
}
struct A {
A() {
}
~A() {
foo();
}
};
int main() {
A a;
}
परिणाम:
d:\>cl /c /W4 foo3.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 15.00.21022.08 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
foo3.cpp
क्योंकि आप 'foo()' में प्रोग्राम को समाप्त करते हैं? – juanchopanza
कुछ 'निजी' बनाना और इसे कार्यान्वित नहीं करना सामान्य तरीका है, ** सी ++ 11 ** को प्राप्त करने के लिए '= delete' है। –
'foo() '' __declspec (noreturn) होना चाहिए'? – ixe013