답변:
-isystem
대신을 사용하여 라이브러리 헤더를 포함 할 수 있습니다 -I
. 이렇게하면 "시스템 헤더"가되고 GCC는 경고를보고하지 않습니다.
extern "C"
경우 C 연결에 대한 이상한 오류를 유발한다는 것 입니다. #include
-isystem
CMake를 사용 하는 경우 이러한 헤더에 대한 경고를 억제 include_directories
하는 기호를 포함하도록 지시문을 수정할 수 SYSTEM
있습니다.
include_directories(SYSTEM "${LIB_DIR}/Include")
^^^^^^
${LIBFOO_USE_FILE}
가 CMake의 include () 명령 과 함께 사용할 변수를 제공하면 어떻게됩니까?
easylogging++
동일한 엄청난 양의 경고를 받았습니다 . easylogging++.h
SYSTEM
pragma를 사용할 수 있습니다. 예를 들면 :
// save diagnostic state
#pragma GCC diagnostic push
// turn off the specific warning. Can also use "-Wall"
#pragma GCC diagnostic ignored "-Wunused-but-set-variable"
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/lexical_cast.hpp>
// turn the warnings back on
#pragma GCC diagnostic pop
gcc
cl
는 수년 동안 능력을 가지고있었습니다 ... 때때로 gcc
적응하는 데 약간 느립니다.
속임수를 찾았습니다. 라이브러리 포함의 -Idir
경우 -isystem dir
메이크 파일에서 사용하는 대신 . 그런 다음 GCC는 시스템이 경고를 포함하고 무시하므로 부스트 등을 처리합니다.
#pragma
컴파일러에 대한 지침입니다. #include 앞에 무언가를 설정하고 나중에 비활성화 할 수 있습니다.
명령 줄 에서도 수행 할 수 있습니다 .
특히 경고 비활성화 에 관한 또 다른 GCC 페이지 입니다.
소스 코드 내에서 #pragma를 사용한 다음 경고를 비활성화하는 이유에 대한 건전한 이유 (주석으로) 를 제공하는 옵션을 선택 합니다. 이것은 헤더 파일에 대한 추론을 의미합니다.
GCC 는 경고 유형 을 분류 하여 이에 접근합니다 . 경고 또는 무시하도록 분류 할 수 있습니다. 이전에 링크 된 기사는 비활성화 될 수있는 경고를 보여줍니다.
참고 : 속성 을 사용하여 특정 경고를 방지하기 위해 소스 코드를 마사지 할 수도 있습니다 . 그러나 이것은 GCC와 매우 밀접하게 연결됩니다.
참고 2 : GCC는 Microsoft 컴파일러에서 사용되는 팝 / 푸시 인터페이스 도 사용합니다. Microsoft는이 인터페이스를 통해 경고를 비활성화합니다. 가능한지 모르겠으므로 추가로 조사해 보시기 바랍니다.
미리 컴파일 된 헤더를 사용해 볼 수 있습니다 . 경고는 사라지지 않지만 적어도 메인 컴파일에는 표시되지 않습니다.
-isystem
,하지만 코드 헤더를 컴파일과에서 모두 사용하는 기억)
시스템 헤더를 명시 적으로 재정의해야하는 경우 pragma로 제한됩니다. make depend
출력 을 통해 사용중인 포함을 확인할 수 있습니다 .
gcc> = 4.6에 대한 진단 푸시 팝 도 참조하십시오.
그러한 경고에 대한 이유가 있어야합니다. 이는 라이브러리를 사용하는 코드의 오류 또는 라이브러리 코드 자체의 오류로 인해 발생합니다. 첫 번째 경우에는 코드를 수정하십시오. 두 번째 경우에는 라이브러리 사용을 중지하거나 FOSS 코드 인 경우 수정하십시오.