Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Kerülje
goto(es.76)
C++ alapvető irányelvek:
ES.76: Kerülje a goto
goto használatát széles körben veszélyes és hibákat okozó gyakorlatnak tekintik. Ez csak generált kódban elfogadható, például nyelvtanból létrehozott elemzőben. A Guidelines Support Library által biztosított modern C++ nyelvi elemekkel és eszközökkel teljesen elkerülhető goto.
Megjegyzések
- Ez a szabály figyelmeztet minden olyan eseményre
goto, amely még akkor is előfordul, ha az halott kódban történik, kivéve a soha nem használt sablonkódot, és ezt a fordító figyelmen kívül hagyja. - A figyelmeztetések megszaporodhatnak, ha egy makró tartalmaz
goto. A jelenlegi jelentéskészítési mechanizmusok az összes olyan esetre mutatnak, ahol az ilyen makrók kibontásra kerülnek. Gyakran javítható egy helyen a makró módosításával, vagy a fenntarthatóbb mechanizmusok érdekében történő használatának elkerülésével.
Kódelemzés neve: NO_GOTO.
példa
"goto clean-up" a makróban
#define ENSURE(E, L) if (!(E)) goto L;
void poll(connection &c)
{
ENSURE(c.open(), end); // C26438
while (c.wait())
{
connection::header h{};
connection::signature s{};
ENSURE(c.read_header(h), end); // C26438
ENSURE(c.read_signature(s), end); // C26438
// ...
}
end:
c.close();
}
"goto clean-up" a makróban lecserélve a következőre: gsl::finally
void poll(connection &c)
{
auto end = gsl::finally([&c] { c.close(); });
if (!c.open())
return;
while (c.wait())
{
connection::header h{};
connection::signature s{};
if(!c.read_header(h))
return;
if(!c.read_signature(s))
return;
// ...
}
}