2009-06-08 4 views
79

이 MSVC 전 처리기 코드와 가장 유사한 GCC는 무엇입니까?번역 단위의 일부에 대해서만 GCC 경고를 선택적으로 비활성화 하시겠습니까?

#pragma warning(push)     // Save the current warning state. 
#pragma warning(disable : 4723)   // C4723: potential divide by 0 
// Code which would generate warning 4723. 
#pragma warning(pop)      // Restore warnings to previous state. 

일반적으로 포함되는 헤더에 특정 경고를 생성하지 않으려는 코드가 있습니다. 그러나 우리는 해당 헤더를 포함하는 파일이 해당 경고를 계속 발생 시키길 원합니다 (프로젝트에서 해당 경고가 활성화 된 경우).

+0

헤더에/usr/포함하거나 기본적으로 그들에게 경고를 생성하지 않습니다 gcc가 무엇을 가지고 설치되어있는 경우 :

다음은 예입니다. – Spudd86

답변

86

트렁크에서 버전 4.6 이후 또는 2010 년 6 월 경에 possible in GCC입니다.

#pragma GCC diagnostic error "-Wuninitialized" 
    foo(a);   /* error is given for this one */ 
#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wuninitialized" 
    foo(b);   /* no diagnostic for this one */ 
#pragma GCC diagnostic pop 
    foo(c);   /* error is given for this one */ 
#pragma GCC diagnostic pop 
    foo(d);   /* depends on command line options */ 
+6

푸시 및 팝 기능이 gcc 4.6 (http://gcc.gnu.org/onlinedocs/gcc-4.6.0/gcc/Diagnostic-Pragmas.html)에 추가되었습니다. –

+0

두 번 팝업하면 두 번 누르기를 원할 것입니다. – Dan

+1

@ Dan : 설명서를 읽고 의견을 말하십시오. 예제의 출처를 주목하십시오. –

34

가장 가까운 것은 GCC diagnostic pragma, #pragma GCC diagnostic [warning|error|ignored] "-Wwhatever"입니다. 그것은 당신이 원하는 것에 아주 가깝지 않으며, 세부 사항과주의 사항에 대한 링크를보십시오.

+1

이 기능을 추가하지 않을 이유가 무엇이고 어디에서 확인할 수 있습니까? (나는 그것을 발견 할 수 없었다.) 경고 push-disable-pop이 유용하다는 것을 알았다. –

+1

gcc에 "기능을 추가하지 않는다"는 것은 작업 패치를 제출 한 사람이 없다는 근거가되는 경향이 있습니다. – chaos

+13

gcc에서 이러한 종류의 세밀한 경고 제어 작업을 수행하거나 코드를 제출하려는 사람은 아무도 없습니다. 이미이 작업을 수행 한 실리콘 밸리의 주요 기업 중 하나와 비용 지불을 기쁘게 생각하는 기업이 있습니다. 누군가 코드를 스트림으로 가져와야합니다. 오히려, (gdb 관리자 중 한 명과 같이) gcat 관리자가이 항목에 꽂혀있는 gcc 관리자는 철학을 가지고 있습니다. "경고가 있으면 버그이고 수정해야합니다." 그래서 그것은 종교적인 주장이며, 그들은 그들이이기도록 코드를 통제합니다. –

31

나는 비슷한 것을했습니다. 타사 코드의 경우 경고를 전혀보고 싶지 않았습니다. 따라서 -I/path/to/libfoo/include을 지정하는 대신 -isystem /path/to/libfoo/include을 사용했습니다. 이렇게하면 컴파일러가 경고를 목적으로 해당 헤더 파일을 "시스템 헤더"로 취급하게되고 -Wsystem-headers을 활성화하지 않으면 대부분 안전합니다. 나는 아직도 몇 가지 경고가 누출되는 것을 보았지만 대부분의 쓰레기는 줄였습니다.

은 include-directory별로 문제 코드를 격리 할 수있는 경우 도움이됩니다. 자신의 프로젝트의 하위 집합이거나 다른 코드와 섞인 경우에는 운이 좋지 않습니다.

+1

간단하고 효과적으로 감사합니다. – GvS

+1

멋진 팁. LLVM을 사용하는 경우 "Apple LLVM 컴파일러 - 언어"섹션의 "기타 C 플래그"아래에 -isystem 플래그를 추가하십시오. – Nestor

+0

@Tom 공유해 주셔서 감사합니다. 나는 당신의 솔루션을 어디서 사용할 것인지 이해할 수 없다. 조금 더 말할 수 있니? –

관련 문제