2011-10-12 5 views
3

레거시 코드를 처리하고 있습니다.EHsc와 EHa가 모두 지정되면 어떻게됩니까?

일부 버그를 수정하려면 일부 파일에 EHa를 제공해야합니다. 나는 건물 전체 프로젝트에 EHsc와 EHa를 모두 테스트했다. 이것은 내 문제를 해결하지만 컴파일러가 EH를 EH보다 우선한다는 경고를줍니다. (옵션 순서는/EHsc/EHa) 이 경고는 EHa가 필요한 파일을 빌드 할 때만 발생합니다. EH 만 필요한 소스 파일에는 표시되지 않습니다.

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

제 질문은이 경고가 실제로 어떤 일이 발생했는지 나타 냅니까? EHa는 실제로 EHa가 필요한 소스 파일에만 적용됩니까? (EHa가 필요없는 다른 파일은 EHsc로 구축 되었습니까?)

감사합니다.

답변

1

예, 경고는 사용자에게 의도 한 바가 아니기 때문에 어떤 일이 발생했는지 알려줍니다. 이것이 컴파일러 경고의 배경입니다.

컴파일러는 "실제로 EHa가 필요한 파일을 알지 못하거나 신경 쓰지 않습니다 (파일이 컴파일 될 때까지 컴파일러에서 파일에 대해 아무 것도 말할 수 없습니다). 적용 할 옵션을 적용합니다. 그리고 둘 다 적용하라는 말을하면 EHA를 적용하려는 것처럼 해석합니다.

컴파일러를 호출 할 때 모든 모순 플래그를 지정하면 이 아님은 "작동하는 컴파일러 옵션을 찾을 때까지 가능한 모든 조합의 컴파일러를 시도하십시오"를 의미합니다.

+0

가능한 모든 조합을 시도하지는 않습니다. 내 관심사는 EHa를 사용함으로써 발생할 수있는 성능 저하 가능성입니다. EHa가 모든 소스 파일에 적용되면, 실제로 필요한 파일에 EHa를 적용하고 EHsc로 다른 사람들을 컴파일하는 방법을 연구 할 계획입니다. 유일한 문제는 여기에 사용 된 Visual C++ 기반 빌드 시스템에 익숙하지 않다는 것입니다. – Niroshan

+0

에 감사드립니다. 개별 파일에 대한 속성을 열고 해당 특정 파일에 대해 플래그를 다르게 설정할 수 있습니다. 그러나 가능한 성능 저하를 걱정하기 전에 실제로 벤치마킹 해 주시기 바랍니다. 조기 최적화와 그 모든 것 – jalf

5

/EHa는 "더 강한"설정입니다. 이것은/EHsc를 의미하지만 C++ 소멸자가 호출되어 C++ 이외의 예외가 던져져서 잡히는 것을 보장합니다. Windows의 SEH 예외. 그냥 plain/EHsc를 사용하면 코드 생성기에서 코드를 최적화하고 괄호로 묶은 코드에서 C++ 예외를 throw하는 방법이 표시되지 않을 때 예외 필터를 생략 할 수 있습니다. 그런 종류의 최적화는 SEH 예외에 대해 작동하지 않을 수 있습니다. 예를 들어 어떤 명령문도 AccessViolation을 throw 할 수 있습니다.

프로그램에서 비표준 __try 및 __except 키워드를 사용하여 SEH 예외를 catch하는 경우에만/EHa가 필요합니다. AccessViolation, DivisionByZero, 부동 소수점 예외, 자체 예외에 대해 SEH를 사용하는 언어 런타임과의 상호 운용성 등이 있습니다. 당신이 그 (것)들을 사용하는 경우에 당신은 전부/EHa로 컴파일 된 ㄴ다는 것을 확인해야한다. SEH 예외가 잡힐 때 오류가 발생하면 메모리 누수가 발생할 수 있습니다.

+0

이 코드는'set_se_translator()'를 사용합니다. 그리고이 기능은 몇몇 파일에서만 사용됩니다. 그 기능을 EHa와 함께 사용하는 파일을 컴파일하고보다 성능 친화적 인 EHsc로 나머지 파일을 만들고 싶습니다. 현재 접근 방식이 그렇게합니까? 고마워요 – Niroshan

+1

MSDN 문서는 분명합니다 :'_set_se_translator를 사용할 때/EHa를 사용해야합니다. ' 몇 파일은 계산에 포함되지 않습니다. 예외 필터 오버 헤드는 32 비트 코드에서는 매우 작지만 64 비트 코드에서는 거의 없습니다. 마이크로 최적화가 되었습니까, 아니면 실제로 * 측정 했습니까? –

+0

오버 헤드가 매우 작 으면 나는 그것에 대해 걱정할 필요가 없다고 생각합니다. 다시 한 번 감사드립니다. 그러나 명확히하고 싶은 몇 가지 사항이 있습니다. 내가 이해 한 바에 따르면 MSDN은 _set_se_translator()를 사용하는 C++ 파일을 참조합니다. 이 기능을 사용하지 않는 다른 파일들은 어떻습니까? 나는 그들에게 EHa를 적용하는 것은 쓸모 없다고 느낀다. 좋은 URL이나 책을 안내해 주시겠습니까? (컴파일러 비트를 자세히 공부해야 할 때가 왔습니다) – Niroshan