Что происходит, если указаны EHsc и EHa - PullRequest
4 голосов
/ 12 октября 2011

Я работаю с устаревшим кодом.

Чтобы исправить ошибку, я должен дать EHa некоторым файлам.Я тестировал, как EHsc, так и EHa для всего проекта при сборке.Это решает мою проблему, но выдает предупреждения о том, что компилятор переопределяет EH с помощью EHa.(порядок опций: / EHsc / EHa) Это предупреждение появляется только при сборке файлов, для которых требуется EHa.Он не отображается в исходных файлах, для которых нужны только EH.

<name of the file that needs EHa>\cl : warning D9025 : overriding '/EHs' with '/EHa'

Мой вопрос: говорит ли это предупреждение о том, что на самом деле происходит?Применяется ли EHa только к исходным файлам, которые действительно нуждаются в EHa?(Другие файлы, которые не требуют EHa, построены с помощью EHsc?)

Спасибо.

Ответы [ 2 ]

6 голосов
/ 12 октября 2011

/ EHa - «более сильный» параметр.Он подразумевает / EHsc, но гарантирует, что деструкторы C ++ вызываются даже тогда, когда генерируется и перехватывается исключение, отличное от C ++.SEH исключения в Windows.Просто / EHsc позволяет генератору кода оптимизировать код и пропускать фильтры исключений, когда он не видит возможности для кода в скобках генерировать исключение C ++.Оптимизация такого рода не может работать для исключений SEH, например, любой оператор может вызвать AccessViolation.

Вам нужен / EHa, только когда вы используете нестандартные ключевые слова __try и __except в своей программе для отлова исключений SEH.AccessViolation, DivisionByZero, исключения с плавающей запятой, взаимодействуют с языковыми средами исполнения, которые используют SEH для своих собственных исключений, и так далее.Если вы используете их, вы должны убедиться, что все ваш код скомпилирован с / EHa.Ошибка может привести к утечке памяти при обнаружении исключения SEH.

1 голос
/ 12 октября 2011

Да, предупреждение говорит вам, что происходит, потому что то, что происходит, может быть не тем, что вы намеревались. Вот и вся идея предупреждений компилятора.

Компилятор не знает или не заботится о том, какие файлы «действительно нуждаются в EHa» (пока файл не скомпилирован, компилятор не может ничего сказать о файле). Он применяет параметры, которые вы говорите, чтобы применить. И вы говорите ему применить оба, и он говорит вам, что интерпретирует это так, как будто вы хотите, чтобы EHA был применен.

Указание каждого противоречивого флага при вызове компилятора означает , а не означает «пробовать каждую возможную комбинацию параметров компилятора, пока не найдете тот, который работает».

...