Oggi ho scoperto per caso che il mio compilatore non si lamenta quando scrive codice all'interno di un'istruzione switch senza un caso. (Si lamentava della mancanza di dichiarazioni di casi, ma dopo aver aggiunto uno dopo il codice, non c'era nemmeno un avvertimento per farmi sapere che il codice era inutile.)Switch senza custodia
Sto cercando di capire se c'è uno scopo per consentire il seguente codice, o se è solo una di quelle cose in cui "è più lavoro limitarlo, quindi è permesso".
#include <iostream>
void foo() {
std::cout << "foo" << std::endl;
}
int main()
{
for (int a = -10; a < 10; ++a)
{
switch(a)
{
foo();
case 4:
std::cout << "4" << std::endl;
}
}
}
Emette ora "4" come previsto quando un == 4, e non è mai uscite foo. Quindi la domanda è, c'è qualche motivo (potenzialmente esoterico ma utile) per consentire l'affermazione foo();
prima del primo caso? So per certo che non sono autorizzato a dichiarare e inizializzare le variabili lì.
(FWIW, ho provato questo su diversi compilatori, e sono tutti cedendo lo stesso comportamento. Sorprendentemente, anche tutti non lo fanno emettere un avvertimento.)
Che compilatore è questo? – turnt
L'ho provato su MSVC 2012 e GCC 4.8.1. – Shirik
Hmm interessante. Un pensiero che viene in mente non è dover scrivere un default: e invece basta scrivere il codice sotto l'ultimo caso. Ma questo urla una potenziale cattiva pratica :) –