d:\opencascade6.2.0\samples\standard\mfc\common\occ_2dviewrd.cpp(60) : warning C4717: 'OCC_2dViewRD::OnFileExportImage' : recursive on all control paths, function will cause runtime stack overflow
О чем этот код? Разве так можно? Или в 7.1 (разработчики настаивают на ней) работает?
gok>О чем этот код? Разве так можно? Или в 7.1 (разработчики настаивают на ней) работает? gok>
Ну, если бы в вызове не было явной квалификации, я бы решил, что это виртуальный вызов.
А так — действительно странно.
gok>d:\opencascade6.2.0\samples\standard\mfc\common\occ_2dviewrd.cpp(60) : warning C4717: 'OCC_2dViewRD::OnFileExportImage' : recursive on all control paths, function will cause runtime stack overflow
gok>О чем этот код? Разве так можно? Или в 7.1 (разработчики настаивают на ней) работает?
Это полный пример? или там еще что-то есть до вызова?
Напрмер
СМ>>>Тогда это нормально
CS>>Что конкретно нормально? Stack overflow?
СМ>throw
Суров ты брат Мухин.
А вот как ты думаешь, когда компайлер человеческим языком говорит:
"recursive on all control paths, function will cause runtime stack overflow" он про throw знает?
CS>>>Что конкретно нормально? Stack overflow?
СМ>>throw
CS>Суров ты брат Мухин.
я уверен, что мой брат не пишет в этом форуме и даже не читает
CS>А вот как ты думаешь, когда компайлер человеческим языком говорит: CS>"recursive on all control paths, function will cause runtime stack overflow" он про throw знает?
он подозревает, именно поэтому warning а не ошибка.
void bar() {
if (++nested>10) throw 1;
}
ps
кстати, т.к. мы тестируем свой компилятор (не С/C++), то и у нас есть странные ф-ии. Надо например проверить хвостовую рекурсию или реакцию на stack overflow.
Здравствуйте, Сергей Мухин, Вы писали:
СМ>Здравствуйте, c-smile, Вы писали:
CS>>>>Что конкретно нормально? Stack overflow?
СМ>>>throw
CS>>Суров ты брат Мухин.
СМ> СМ>я уверен, что мой брат не пишет в этом форуме и даже не читает
Молодец твой брат, у него больше времени на изучение C++ остается.
CS>>А вот как ты думаешь, когда компайлер человеческим языком говорит: CS>>"recursive on all control paths, function will cause runtime stack overflow" он про throw знает?
СМ>он подозревает, именно поэтому warning а не ошибка.
Вона как! Какой мнительный и неграмотный компакйлер нам попался...
А вот мнительный, но грамотный компайлер сказал бы например так: "function may cause runtime stack overflow".
СМ>ps СМ>кстати, т.к. мы тестируем свой компилятор (не С/C++), то и у нас есть странные ф-ии. Надо например проверить хвостовую рекурсию или реакцию на stack overflow.
"Кстати" тут не кстати. Совсем.
Или я не понимаю русский язык или русккий в вашей семье учит тоже брат.
Здравствуйте, c-smile, Вы писали:
CS>Здравствуйте, Alex Dav, Вы писали:
СМ>>>>
СМ>>>>void foo(){bar();foo();}
СМ>>>>
СМ>>>>Тогда это нормально
CS>>>Что конкретно нормально? Stack overflow?
AD>>ну почему в этом случае void foo(){bar();foo();} возможна просто рекурсия
CS>Итить...
CS>Что такое "просто рекурсия"?
согласен
CS>Понятия редуцирования хвостовой рекурсии в С++ нет по определению.
но многие компиляторы это делают. попробуй данный пример откомпилировать в MS 2005
Здравствуйте, c-smile, Вы писали:
CS>Здравствуйте, Сергей Мухин, Вы писали:
СМ>>по существу в твоем посте ничего нет.
CS>Мой пост обратил материю твоего поста в спиритуальные электрические вихри, из коих и возникла синекдоха отвечания.
мало кто знает откуда эта цитата.
приведу ее полностью
Старичок словно взорвался.
– Высочайшие достижения нейтронной мегалоплазмы! – провозгласил он. – Ротор поля наподобие дивергенции градуирует себя вдоль спина и там, внутре, обращает материю вопроса в спиритуальные электрические вихри, из коих и возникает синекдоха отвечания...
У меня потемнело в глазах, рот наполнился хиной, заболели зубы, а проклятый нобль вё все говорил и говорил...
Здравствуйте, Сергей Мухин, Вы писали:
CS>>>>Что конкретно нормально? Stack overflow?
AD>>>ну почему в этом случае void foo(){bar();foo();} возможна просто рекурсия
CS>>Итить...
CS>>Что такое "просто рекурсия"?
СМ>согласен
С чем?
CS>>Понятия редуцирования хвостовой рекурсии в С++ нет по определению.
СМ>но многие компиляторы это делают. попробуй данный пример откомпилировать в MS 2005
Пративные какие эти многия компайлеры...
А вот VC++ 2005 либо выкинет функцию вообще либо при выключенной оптимизации сгенерирует честный код приводящий к:
Unhandled exception at 0x00401009 in foo.exe: 0xC00000FD: Stack overflow.
Здравствуйте, c-smile, Вы писали:
CS>>>Что такое "просто рекурсия"?
СМ>>согласен
CS>С чем?
что слова "просто рекурсия" не уместны
CS>>>Понятия редуцирования хвостовой рекурсии в С++ нет по определению.
СМ>>но многие компиляторы это делают. попробуй данный пример откомпилировать в MS 2005
CS>Пративные какие эти многия компайлеры...
CS>А вот VC++ 2005 либо выкинет функцию вообще либо при выключенной оптимизации сгенерирует честный код приводящий к: CS>Unhandled exception at 0x00401009 in foo.exe: 0xC00000FD: Stack overflow.
Здравствуйте, Сергей Мухин, Вы писали:
CS>>>>Понятия редуцирования хвостовой рекурсии в С++ нет по определению.
СМ>>>но многие компиляторы это делают. попробуй данный пример откомпилировать в MS 2005
CS>>Пративные какие эти многия компайлеры...
CS>>А вот VC++ 2005 либо выкинет функцию вообще либо при выключенной оптимизации сгенерирует честный код приводящий к: CS>>Unhandled exception at 0x00401009 in foo.exe: 0xC00000FD: Stack overflow.
СМ>во генерация VC++ 2005:
СМ>
Да, действительно, VC++ 2005 смог редуцировать хвостовую рекурсию в простой цикл в данном случае.
Но это 1) не является стандартным поведением C++ и 2) работает только в режиме включенной оптимизации (какие ключи за это отвечают?).
Я не уверен в том что это вообще хорошо ибо такое поведение компилятора заведомый источник проблем типа: в Debug работает а в Release — нет. Т.е. закладываться на это, а тем более говорить "все нормально" я бы не стал.
В любом случае в оригинальном сообщении этого топика хвостовой рекурсией нет поэтому tail recursion в этом контексте это скорее пища для ума чем нечто практически полезное.