c++ - 명령어 - 명령 행 스위치가없는 gcc 경고를 비활성화하려면 어떻게합니까?




리눅스 gdb list (3)

이 경고의 수백 가지 인스턴스가 있으며 컴파일러 출력이 넘칩니다. 무시하기 어렵다.

이것이 외부 라이브러리 인 경우이 경고를 단일 경고 보고서로 줄이는 방법이 있습니다. 단일 경고 메시지로 살 수 있다고 생각합니다.

이 라이브러리 API를 고유 한 함수 / 방법으로 래핑하십시오. 이 API가 사용되는 자체 코드의 복잡한 수정을 피하기 위해 다른 네임 스페이스를 사용하여 1 : 1로 이름을 지정할 수 있습니다. 이런 식으로이 경고는 문제가있는 헤더 파일을 포함한 소스가 포함 된 경우에만보고됩니다. 문제는 헤더 파일을 한 번만 포함하는 것입니다.

이 API의 모양에 따라 수행하기 어려울 수 있습니다.

어쨌든 이것이 타사 라이브러리 인 경우이 방법을 사용하면 해당 라이브러리를 쉽게 모의하고 코드 테스트를 작성할 수 있습니다.

다음과 같은 경고가 나타납니다.

warning: 'X' is initialized and declared 'extern'

큰 문제가 아닌 것 같아서 비활성화 할 수 있습니다. 코드를 제어 할 수 없기 때문에 코드를 변경하는 것은 실제로 좋은 생각이 아닙니다. 코드를 컴파일하면됩니다. 따라서 경고를 비활성화하고 싶습니다.

옆에 -WSomeDefect 키가 있으면 -Wno-SomeDefect 명령 행 스위치를 사용할 수 있지만이 경고에 대한 별도의 스위치가없는 것 같습니다.

이러한 경고를 비활성화하려면 어떻게합니까?


유감스럽게도이를 비활성화하는 특정 플래그는 없지만 모든 경고를 비활성화 할 수있는 -w 플래그는 경고를 다시 활성화 할 수 없습니다.

GCC 문서에서 :

-w
모든 경고 메시지를 금지하십시오.

그러나 여기서 더 나은 옵션은 변수 선언 / 정의에서 extern 을 제거하는 것입니다. 이런 식으로 컴파일러는 변수가 변환 단위 내에 정의되어 있음을 알고 있습니다. 코드 소유자에게 연락하여 코드를 변경할 수 있는지 확인할 수 있습니다.


이 경고를 생성하는 코드는 유효하지 않은 C 이므로 수정해야합니다. C 언어는 이와 같은 제약 조건 위반에 대해 "진단"(경고 또는 오류)을 발행해야하며이를 비활성화 할 방법이 없어도됩니다. extern 은 초기화 프로그램에서 제약 조건 위반이라고 생각했습니다 (일반적인 사용법에서는 extern 은 정의가 아니라 선언 만 제공하기 때문에). 그러나 6.9.2 ¶1에 따라 :

객체의 식별자 선언에 파일 범위와 이니셜 라이저가있는 경우 선언은 식별자에 대한 외부 정의입니다.

문법이 이니셜 라이저로 extern 을 허용하는 것처럼 extern 므로 이것은 실제로 유효한 정의입니다.

GCC에는 경고를 끄는 -w 옵션이 있지만 일부 경고를 무시하고 다시 켤 수없는 모든 경고를 사용하지 않습니다. 제약 조건 위반 인 경우에는 의미가 있으며 유효하지 않은 코드를 수정하는 표시 일 것입니다. 그러나 코드는 유효하며 GCC는 코드에 대해 가짜 경고를 생성하지 않는 메커니즘을 제공해야합니다.

Eljay가 주석에서 언급 한 것처럼 :

경고는 몇 가지 범주로 나뉩니다. 표준 필수 진단 메시지로; 일반적인 우발적 언어 남용 / 오용에 대한 보풀과 같은 정적 분석; 의미가 있지만 여전히 문체 론적 의견 (예 : -Weffc++ ); 아마도 너무 -Weverything 사소한 것 (예를 들어, -Weverything 또는 -pedantic ). 후자의 범주에는 OP의 경우와 같이 특정 경고를 비활성화 할 수있는 "탈퇴"방법이 있어야합니다.

GCC는 일반적으로이 요구를 존중하려고 노력하며,이를 비활성화 할 방법이 없으면 GCC 버그 추적기에 보고 할 가치가 있다고 생각합니다.





gcc-warning