Ich arbeite an einer Anwendung, die mit VC9 gebaut wurde und ich habe eine Warnung getroffen, die ich nicht ganz verstehe: Warum gibt es eine "unerreichbarer Code" Warnung auf der schließenden Klammer der Konstrukteur?Nicht erreichbarer Code an der schließenden Klammer des Konstruktors
Der minimale Testfall das Problem zu reproduzieren ist:
__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;
}
Dies muss mit/W4 kompiliert werden, um die Warnung auszulösen. Alternativ können Sie mit/we4702 kompilieren, um einen Fehler bei der Erkennung dieser Warnung zu erzwingen.
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
Kann jemand erklären, was genau nicht erreichbar ist hier? Meine beste Theorie ist, dass es der Destruktor ist, aber ich hätte gerne eine definitive Antwort.
Wenn ich diesen Code warnen-sauber machen möchte, wie kann ich das erreichen? Das Beste, was ich mir vorstellen kann, ist das Konvertieren in einen Kompilierungsfehler.
struct A {
private:
A(); // No, you can't construct this!
};
int main() {
A a;
}
Edit: zur Klärung, wird das Programm mit einer noreturn Funktion endet normalerweise nicht dazu führen, einen unerreichbaren Code auf der Klammer Schließen Warnung, dass Funktionsaufruf umschließt.
__declspec(noreturn) void foo() {
// Do something, then terminate the program
}
struct A {
A() {
}
~A() {
foo();
}
};
int main() {
A a;
}
Ergebnisse in:
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
Weil Sie das Programm in 'foo()' beenden? – juanchopanza
Etwas "privat" machen und es nicht implementieren, ist der übliche Weg, ** C++ 11 ** hat '= delete', um das zu erreichen. –
muss 'foo()' ''__declspec (noreturn)' 'sein? – ixe013