Компилятор Msvc 2013
Этот компилятор есть в пакетах Visual Studio, Visual Studio Express или в некоторых версиях Microsoft Windows SDK. Если у вас ещё не. Компиляция для систем, начиная с Windows XP и Windows Server 2003, поддерживается при использовании Visual Studio 2005 — Visual Studio 2013. При сборке с Visual.
SЗдравствуйте, qadmium, Вы писали: Qспасибо, правда пока разрулили прагмами SМожет быть вы не совсем то разрулили? В вашем примере оптимизирующий компилятор выбросил всю обработку исключения, так как увидел, что результат этой обработки нигде не используется. Это его полное право. Если же у вас ситуация 'исправилась' после применения прагм, то проблема была в чем-то другом, а не в не использовании результата обработки исключений.
Во-первых у него нет таких прав, т.к. Несловленное исключение рождает неподконтрольные компилятору сайдэффекты, во-вторых — все равно не помогает, по кр мере в VS2008 все еще крэшится, помогает тока переключение на /EHa ну или чтото тина if (::GetTickCount2 &&::GetTickCount1) throw PluginException; внутри трайкэтча Кстати, дополнение к — в новой студии есть синхронной обработки исключений, и судя по всему — баг, (а может и фича ), компилятора заключается в том, что вызов метода по указателю считается extern C вызовом, никогда не бросающим исключений.
Кстати, в шестой студии (помните такую ) — этот код нормально работает в любой модели исключений. Здравствуйте, ononim, Вы писали: OВо-первых у него нет таких прав, т.к. Несловленное исключение рождает неподконтрольные компилятору сайдэффекты, В примере, который привел ТС, компилятор 'видит' весь текст программы и видит, что никаких побочных эффектов нет. И результатом работы вызываемой функции никто не интересуется. Скорее всего он простоо выкинул вызов функции вообще. OКстати, дополнение к — в новой студии есть синхронной обработки исключений, и судя по всему — баг, (а может и фича ), компилятора заключается в том, что вызов метода по указателю считается extern C вызовом, никогда не бросающим исключений.

А в чем состоит то баг? У меня программа (с выодом результата вызова функции) отрабатывает как надо, выводит 0, что и ожидается.
VS2010+SP1 release. Пока ТС показал только ассемблерный код, который еще неизвестно к чему относится.
Ассемблрный код от оптимизирующего компилятора бывает очень интересным, но все же надо демонстрировать баг на результатах работы программы. OКстати, в шестой студии (помните такую ) — этот код нормально работает в любой модели исключений. С тех пор оптимизирующие компиляторы ушли немного вперед. Здравствуйте, Serg27, Вы писали: SВ примере, который привел ТС, компилятор 'видит' весь текст программы и видит, что никаких побочных эффектов нет. И результатом работы вызываемой функции никто не интересуется. Скорее всего он простоо выкинул вызов функции вообще. ТС привел ассемблерный листинг, где видно, что 1) виртуальная функция вызвается (то есть компилятор не выбросил этот вызов) 2) внешняя функция возвращает true, а не false, как это задумывалось так что гипотеза о супероптимизаторе неверна.
OВо-первых у него нет таких прав, т.к. Несловленное исключение рождает неподконтрольные компилятору сайдэффекты, SВ примере, который привел ТС, компилятор 'видит' весь текст программы и видит, что никаких побочных эффектов нет. И результатом работы вызываемой функции никто не интересуется. Скорее всего он простоо выкинул вызов функции вообще.
Исключение вылетает наружу из подконтрольной компилятору области — и там вызывает сайдэффекты. В частности, крэш. OКстати, дополнение к — в новой студии есть синхронной обработки исключений, и судя по всему — баг, (а может и фича ), компилятора заключается в том, что вызов метода по указателю считается extern C вызовом, никогда не бросающим исключений. SА в чем состоит то баг? У меня программа (с выодом результата вызова функции) отрабатывает как надо, выводит 0, что и ожидается.

VS2010+SP1 release. Пока ТС показал только ассемблерный код, который еще неизвестно к чему относится. Ассемблрный код от оптимизирующего компилятора бывает очень интересным, но все же надо демонстрировать баг на результатах работы программы. У меня + крэшится будучи скомпиленным в VS2008. OКстати, в шестой студии (помните такую ) — этот код нормально работает в любой модели исключений. С тех пор оптимизирующие компиляторы ушли немного вперед. Дело не в оптимизации, а в выбранной модели исключений.
Разница между по-умолчательными сборками релиз и дебаг помимо включенных/выключенных оптимизаций заключается еще в том, что в дебаге по дефолту используется /EHa, а в релизе — /EHs. Разница между /EHs и /EHa — в том что при /EHa компилятор считает что исключение может быть брошено чем угодно, а при /EHs — компилятор считает что исключение может быть брошено тока явно видимым им throw'ом. В примере ТС компилятор 'не видит' throw — и потому не создает SEH фрейм, считая его не нужным. Проблема гарантированно фиксится переключением модели исключений или вставкой в try.catch кода, который компилятор посчитает потенциальным источником исключений. Здравствуйте, uzhas, Вы писали: UЗдравствуйте, Serg27, Вы писали: UТС привел ассемблерный листинг, где видно, что U1) виртуальная функция вызвается (то есть компилятор не выбросил этот вызов) в этом примере виден кусок этой функции. В листинге компилятора это совершенно не означает, чт это код вызывается.
Нужно смотреть весь листинг, чтобы делать выводы. Хотя конечно кусок этот очень странный, что тут спорить. U2) внешняя функция возвращает true, а не false, как это задумывалось У меня в реальной программе функция возвращает false.
Стандартный release VS2010+sp1. Если конечно добавить вывод результата вызова. Uтак что гипотеза о супероптимизаторе неверна Код у ТС ничего не выводит и делать выводы о неправильной работе или баге невозможно.
У меня модифицированный код выводит то что надо. Скорее всего проблема у ТС более сложная и не может быть выяснена по информации, которую он предоставил. Нужен рабочий пример, описание ожидаемого вывода и реального вывода. Так как речь идет о режимах работы компилятора, то нужно полный список ключей компиляции.
Без этого говорить о баге невозможно. Здравствуйте, ononim, Вы писали: UЗдравствуйте, ononim, Вы писали: OВ частности, крэш.
Uмы о каком коде говорим O OИсключение кидается, не ловится, вылетает за пределы main'а и CRT — и получаем крэш. С тем же успехом компилятор может игнорировать вычисления return кода из main'а — он ведь сам этот return код нигде не использует Ключи компилятор в студию, чтобы можно было попытаться повторить. С кодом в стандартной сборке все в порядке. Для контроля скопируйте свой код в codepad или ideone и посмотрите, что с ним сделает gnu c.
O OИсключение кидается, не ловится, вылетает за пределы main'а и CRT — и получаем крэш. С тем же успехом компилятор может игнорировать вычисления return кода из main'а — он ведь сам этот return код нигде не использует SКлючи компилятор в студию, чтобы можно было попытаться повторить. Нате проект (VS2008) с готовыми бинарниками в release/debug, повторяйте сколько угодно: SС кодом в стандартной сборке все в порядке. SДля контроля скопируйте свой код в codepad или ideone и посмотрите, что с ним сделает gnu c фу как невежливо.
Здравствуйте, ononim, Вы писали: OДело не в оптимизации, а в выбранной модели исключений. Разница между по-умолчательными сборками релиз и дебаг помимо включенных/выключенных оптимизаций заключается еще в том, что в дебаге по дефолту используется /EHa, а в релизе — /EHs. Разница между /EHs и /EHa — в том что при /EHa компилятор считает что исключение может быть брошено чем угодно, а при /EHs — компилятор считает что исключение может быть брошено тока явно видимым им throw'ом. В примере ТС компилятор 'не видит' throw — и потому не создает SEH фрейм, считая его не нужным. Проблема гарантированно фиксится переключением модели исключений или вставкой в try.catch кода, который компилятор посчитает потенциальным источником исключений. Внимательно почитал текст выше. Мне кажется, что Вы не совсем понимаете, что делают эти ключи.
К нашему случаю они не имеют отношения. В стандартных release и debug у VS всегда используются ключи /EHsc. Чтобы его менять надо понимать зачем, это делать.
Асинхроные исключения не имеют никакого отношения к С исключениям. Это windows специфик.
Сделайте все ключи компиляции стандартными и посмотрите — не пректратятся ли у вас крэши. OДело не в оптимизации, а в выбранной модели исключений.
Разница между по-умолчательными сборками релиз и дебаг помимо включенных/выключенных оптимизаций заключается еще в том, что в дебаге по дефолту используется /EHa, а в релизе — /EHs. Разница между /EHs и /EHa — в том что при /EHa компилятор считает что исключение может быть брошено чем угодно, а при /EHs — компилятор считает что исключение может быть брошено тока явно видимым им throw'ом. В примере ТС компилятор 'не видит' throw — и потому не создает SEH фрейм, считая его не нужным. Проблема гарантированно фиксится переключением модели исключений или вставкой в try.catch кода, который компилятор посчитает потенциальным источником исключений. SВнимательно почитал текст выше. Мне кажется, что Вы не совсем понимаете, что делают эти ключи.
К нашему случаю они не имеют отношения. В стандартных release и debug у VS всегда используются ключи /EHsc. Чтобы его менять надо понимать зачем, это делать. Асинхроные исключения не имеют никакого отношения к С исключениям. Это windows специфик. Сделайте все ключи компиляции стандартными и посмотрите — не пректратятся ли у вас крэши Гм да, действительно, уже одинаковые (В VS6 они вроде были разными -я и 'экстраполировал'). Но тем не менее — проект вам в руки — с дефолтовыми настройками все крэшистя в релизе ибо нет SEH фрейма, с /EHa — не крэшится, ибо SEH фрейм таки есть.
Здравствуйте, ononim, Вы писали: OOГм да, действительно, уже одинаковые (В VS6 они вроде были разными -я и 'экстраполировал'). Но тем не менее — проект вам в руки — с дефолтовыми настройками все крэшистя в релизе ибо нет SEH фрейма, с /EHa — не крэшится, ибо SEH фрейм таки есть.
Взял проект, засунул его в VS2012 express (сейчас я дома и есть тольео он). Проект переконвертировался. Пересобрал release. Запускаю из студии. Ничего не крэшится. У меня на двух компиляторах VS2010 и VS2012 проблем нет.
Ваша программа действительно крэшится. В чем в ней дело я не знаю. OOГм да, действительно, уже одинаковые (В VS6 они вроде были разными -я и 'экстраполировал').
Но тем не менее — проект вам в руки — с дефолтовыми настройками все крэшистя в релизе ибо нет SEH фрейма, с /EHa — не крэшится, ибо SEH фрейм таки есть. SВзял проект, засунул его в VS2012 express (сейчас я дома и есть тольео он). Проект переконвертировался. Пересобрал release.
Запускаю из студии. Ничего не крэшится.
У меня на двух компиляторах VS2010 и VS2012 проблем нет. Ваша программа действительно крэшится. В чем в ней дело я не знаю.
Дело в том, что во первых надо внимательнее читать сообщения: msvc 2008 sp1, 2010 sp1 в дефолтной release конфигурации. В msvc 2012 не смог воспроизвести. (c) У меня 2008 ваще без sp судя по тому что она в эбаут пишет. А насчет вашей 2010 sp3 никто ничего и не обещал. Теперь ясно, что в 2010 sp1 все плохо а в sp3 — все хорошо.
Хозяюшке на заметку, так сказать. SХотя сегодня и пятница, но я вроде бы нигде не писал о VS2010+SP3. У меня стоит VS2010+SP1.
SP3 нет такого в принципе. SТС не прав — в VS2010+SP1 проблем нет (с его исходным кодом). Про VS2008 мнения не имею — с ней не работал. Гм да, это уже я невнимательно читал насчет вашей 2010й. К слову к студии кроме СП еще и хотфиксы бывают разные приходят. Ну — уж как есть — проект в архивчике был создан визардом 2008й студиеи, в него вкопипащен код затем сразу скомпилен, результат подчищен от темпарей, зазипован и закинут на файлопомойку — и он крэшится именно изза того что ТС описал — throw есть, а catch'а нету И только не надо говорить, что это нормальное поведение для оптимизирующего компилятора.
Самая актуальная документация по Visual Studio 2017:. В состав Visual C включен компилятор языка C для командной строки, позволяющий создавать все, от простых консольных приложений, до универсальных приложений Windows, приложений Магазина Windows и компонентов.NET. В этом пошаговом руководстве приводятся инструкции по созданию простой консольной программы на языке Visual C в текстовом редакторе с последующей компиляцией из командной строки.

Примечание В интегрированной среде разработки Visual Studio также можно компилировать программы Visual C. Для получения дополнительной информации см.
В этом пошаговом руководстве вместо примера программы, приведенного далее, можно использовать собственную программу на Visual C. Кроме того, можно использовать образец кода на языке Visual C из другого раздела справки.
Для выполнения этого пошагового руководства у вас должна быть версия Visual Studio, включающая компоненты Visual C. Для работы рекомендуется владеть основами языка C. Эти инструкции предполагают, что вы используете Windows 10 и Visual Studio 2015. Для других сред и версий инструкции не будут сильно отличаться.
Создание файла исходного кода на языке Visual C и его компиляция из командной строки. Сначала откройте командную строку разработчика. Для запуска компилятора Visual C требуется специальная среда командной строки, поэтому вы не можете использовать обычную командную строку в этом пошаговом руководстве. В меню Пуск Windows откройте раздел Все приложения. Прокрутите список вниз, чтобы найти и открыть папку Visual Studio для вашей версии Visual Studio, а затем щелкните ярлык Командная строка разработчика. Создайте новый каталог для хранения программы.
В окне Командная строка разработчика введите команду cd, чтобы перейти в корень диска. Введите команду md examples, чтобы создать каталог для примера кода. Затем введите команду cd examples, чтобы сделать его текущим рабочим каталогом. Здесь будет храниться ваша первая программа. В командной строке введите notepad hello.cpp.
Когда появится запрос на создание файла, нажмите кнопку Да. Откроется пустое окно Блокнота, в котором можно ввести код. В Блокноте введите следующие строки. Оптимизирующий компилятор Microsoft (R) C/C версии 4 для x86 (C) Корпорация Майкрософт (Microsoft Corporation). Все права защищены. Hello.cpp Microsoft (R) Инкрементный компоновщик версии 4.0 (C) Корпорация Майкрософт (Microsoft Corporation).
Все права защищены. /out:hello.exe hello.obj При наличии ошибок проверьте код в Блокноте, чтобы убедиться, что он совпадает с примером. Снова запустите команду компилятора после сохранения изменений. Если не удалось найти команду cl, убедитесь, что вы используете окно командной строки разработчика, а не обычной командной строки. Возможно, при установке Visual Studio потребуется установить компонент Visual C, если он не установлен.
Чтобы запустить программу hello.exe, в командной строке введите hello. Программа выводит следующий текст и закрывается. Подробности об открытии окна командной строки разработчика для работы с программами командной строки см. В зависимости от операционной системы и конфигурации компьютера для успешной компиляции кода из этого пошагового руководства могут потребоваться учетные данные администратора. Чтобы запустить окно командной строки разработчика от имени администратора, щелкните правой кнопкой мыши элемент Командная строка разработчика и выберите команду Запуск от имени администратора.
Параметр командной строки /EHsc указывает компилятору на необходимость обработки исключений C. Дополнительные сведения см.