Unicode — переключатель не работает в переполнении стека

Я столкнулся с очень странной проблемой сегодня. Давайте констатируем следующий код:

int llex(){
cout<<"enter 1"<<endl;
char32_t c = U'(';
cout<<(c==U'#')<<endl;
switch(c){
case U'#':
cout<<"enter 2"<<endl;
return 5;
default:
break;
}
}

int main( int argc, char** argv)
{
cout<<"enter 1"<<endl;
char32_t c = U'(';
cout<<(c==U'#')<<endl;
switch(c){
case U'#':
cout<<"enter 2"<<endl;
return 5;
default:
break;
}

cout << "------------" << endl;
llex();
}

И вывод:

enter 1
0
------------
enter 1
0
enter 2

Обратите внимание, что код в основном является идентичным коду в llex функция. Почему они выдают разные результаты? (Я использую C ++ 11 на Clang).

3

Решение

Ваш llex() функция должна всегда возвращать значение, но это не так. Это неопределенное поведение если поток управления не попадает в return заявление. В соответствии с пунктом 6.6.3 / 2 стандарта C ++ 11:

Выпуск из конца функции эквивалентен возврату без значения; это приводит к неопределенным
поведение в функции, возвращающей значение
.

Если вы не исправите это, вы не сможете делать какие-либо предположения относительно вашей программы и не иметь никаких ожиданий по этому поводу.

Например, я не могу воспроизвести поведение в это фиксированный живой пример.

11

Другие решения

Вам не хватает оператора возврата конца функции и закрывающих фигурных скобок для вашего переключателя в функции.

int llex(){
cout<<"enter 1"<<endl;
char32_t c = U'(';
cout<<(c==U'#')<<endl;
switch(c){
case U'#':
cout<<"enter 2"<<endl;
return 5;
default:
break;
}
return 0;
}
1

По вопросам рекламы [email protected]