VC ++ 컴파일러 : 현재 경고 수준 또는 재정의를 결정하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/976275

문제

경고 C4244 (데이터 손실)가 억제되고 있음을 방금 발견 한 프로젝트가 있습니다. 나는 일부 끔찍한 MS 헤더 가이 경고를 억제하고 상기 헤더를 포함하는 모든 번역 장치에 대해 억압을 억제하고 있다고 의심하지만, 수많은 헤더 중 어느 것이 잘못되었는지 결정하지 않았다.

따라서 다른 프로그래밍 문제와 마찬가지로 이진 검색을 수행하고 현재 경고 수준을 인쇄하고 가능한 경우 주요 사전 컴파일 된 헤더에서 억제 된 경고를 시작하고 싶습니다.

누구든지 내가 사용할 수있는 컴파일러 지시문이나 어떤 접근 방식을 취할 수 있는지 아는 사람이 있습니까?

발신자가 계약을 위반하고 서명 된 바이트 대신 정수를 보내려고 할 때 헤더의 신중하게 구성된 유형 선언이 컴파일러 경고를하지 못하고 있다는 사실을 알 수는 없습니다 ( 현재 버그를 해결하려는 버그).

생각?

메모:

전체 솔루션을 통해 #Pragma를 검색하면 #Pragma 경고 (Disable : XXXX)의 균형 잡힌 선언과 #Pragma 경고 (기본값 : XXXX) 만 제공합니다. 그리고 그 참조 중 어느 것도 4244.

전체 솔루션에 걸쳐 4244의 검색은 일치하지 않습니다 (나는 그 경고를 무시하지 않으며, 내 포함 된 라이브러리, 하위 프로젝트 등).

전체 MS에 걸쳐 4244의 검색에는 경로가 포함되어 있습니다. 나타나다 호출하기 전에 설정된 #define 기호에 따라 균형을 잡거나 거의 그렇게합니다. 따라서 MS가 잘못되었다는 의심 (헤더에서 조잡한 작업을 수행 한 MS의 이전 역사와 결합).

도움이 되었습니까?

해결책 4

추가 조사 후 :

/p가 너무 오래 걸립니다 (거의 한 시간 동안 몇 파일을 넘어서는 것을 목격 한 적이 없으므로 그 빌드를 취소했습니다).

나는 현재 경고 수준이 무엇인지, 또는 편집의 주어진 지점에서 유효한 재정의를 인쇄 할 명확한 방법을 찾을 수 없었습니다. 따라서 /p 논쟁이 실제로 당신에게 유용하지 않으면 내가 요청한 질문은 실제로 대답하지 않습니다 (내가 언급했듯이, 그것은 내 목적에 비현실적이었습니다).

내가 할 수 있었던 것은 경고 레벨에 해당 경고가 활성화 된 것으로 포함 된 경우 필요한 경고를 생성 해야하는 다양한 헤더에 인라인 호출을 구성하는 것이 었습니다.

인라인 int 테스트 (char value) {return ++ 값; }

"뭔가"포함

인라인 int test1 (int value) {return test (value); } // c4244를 생성해야합니다 - 이전 #include가 경고 수준을 엉망으로 만들지 않았거나 경고 4244를 재정의하지 않은 경우 데이터 손실 가능.

등등...

결국, 내가 발견 한 것은 특히 4244가 그와 관련된 몇 가지 이상한 규칙을 가지고 있으며, 그것이 가장 높은 경고 수준 인 /W4 (경고 레벨 4)를 제외하고는 효과적으로 "비활성화"된다는 것입니다. 그 경고 수준은 매우 감동적이며 그들에 대한 우리의 범위를 벗어난 많은 것들에 대해 불평하기 때문에 /W4를 활성화하고 싶지 않았습니다.

대신 내가 한 일은 다음을 stdafx.h pch에 넣는 것이 었습니다.

Pragma 경고 (오류 : 4244) // 이것은 활성 경고 수준에 관계없이 모든 상황에서 암시 적 유형 변환으로 인한 데이터 손실 가능성에 대한 경고를 완전히 가능하게합니다.

그것은 효과가있었습니다.

따라서 MS는 우리에게 영향을 준 파일에서 불균형 경고를 무시하지 않았습니다. 그것은 4244가 가장 높은 경고 수준을 제외하고는 매우 용서하는 것입니다.

당신의 도움을 주셔서 감사합니다!

다른 팁

또 다른 옵션은 추가하는 것입니다 이것

#pragma warning (defualt) 

바로 다음 파일 상단에서 #include이렇게하면 경고를 infualt에 재설정하여 무시할 수있는 무시를 버립니다.

다른 메모에서, 나는 Microsoft 헤더가 경고를 비활성화 할 가능성이 거의 없다는 것을 알았습니다.

"C4244"에 대한 모든 헤더 파일을 검색 할 수 있습니까? 아니면 사전 컴파일 된 헤더 파일에만 액세스 할 수 있습니까?

사용부터 시작할 수 있습니다 /p 컴파일러 명령 줄 옵션. 사전 처리기의 출력 파일에 출력됩니다. 이렇게하면 실제로 경고 비활성화를 추가하는 헤더인지 확인하고 어떤 헤더인지에 대한 힌트를 수집하려고합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top