Я столкнулся с очень странной проблемой сегодня. Давайте констатируем следующий код:
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).
Ваш llex()
функция должна всегда возвращать значение, но это не так. Это неопределенное поведение если поток управления не попадает в return
заявление. В соответствии с пунктом 6.6.3 / 2 стандарта C ++ 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;
}