私は彼のC++割り当ての1つで友人を手伝っていましたが、次のコードスニペットがMSVCで例外をスローすることがわかりましたが、G ++でコンパイルするときには全く同じコードがうまくいきます。例外は、getValue()
というこの関数が何も返さなかったために返されました。コンパイラをG ++からMSVCに切り替えるときに、このswitch文が何も返さないのはなぜですか?
string getValue(int value) {
ostringstream convert;
string rtnValue;
switch (value) {
case 11:
{
rtnValue = "J";
break;
}
case 12:
{
rtnValue = "Q";
break;
}
case 13:
{
rtnValue = "K";
break;
}
case 14:
{
rtnValue = "A";
break;
}
default:
{
//
// if the value is a a number, we assume it is 2..10
//
convert << value; // use a stream to convert the number
rtnValue = convert.str(); // into a string
if (value < 2 || value > 10)
{
rtnValue = "ERROR" + rtnValue + "ERROR";
}
}
return rtnValue;
}
}
このプログラムは、整数を文字列に変換します。 11〜14の数値については、switch文を使用します(これは最適な実装ではありませんが、導入クラスです)。
これは、最後に別のreturn文を追加することで簡単に解決できることがわかりました。
string getValue(int value) {
ostringstream convert;
string rtnValue;
switch (value) {
case 11:
{
rtnValue = "J";
break;
}
case 12:
{
rtnValue = "Q";
break;
}
case 13:
{
rtnValue = "K";
break;
}
case 14:
{
rtnValue = "A";
break;
}
default:
{
//
// if the value is a a number, we assume it is 2..10
//
convert << value; // use a stream to convert the number
rtnValue = convert.str(); // into a string
if (value < 2 || value > 10)
{
rtnValue = "ERROR" + rtnValue + "ERROR";
}
}
return rtnValue;
}
return rtnValue;
}
これでMSVC用に修正されました(また、チェックした場合はG ++と仮定しています)。
この修正はなぜ機能しましたか? MSVCとG ++はswitch文に関して括弧を異なる方法で扱いますか?