편집하고 싶지 않은 타사 코드에서 gcc에서 나오는 미사용 변수 경고를 어떻게 비활성화합니까?


93

사용하지 않는 변수 경고를 끄기 위해 gcc 컴파일러에 어떤 스위치를 전달하는지 알고 싶습니다. Windows의 부스트에서 오류가 발생하고 부스트 코드를 만지고 싶지 않습니다.

C:\boost_1_52_0/boost/system/error_code.hpp: At global scope:
C:\boost_1_52_0/boost/system/error_code.hpp:214:36: error: 'boost::system::posix_category' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:215:36: error: 'boost::system::errno_ecat' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:216:36: error: 'boost::system::native_ecat' defined but not used [-Werror=unused-variable]

나는 모두를 사용하여 시도하지 -Wunused-value하고 -Wno-unused-value있지만, 어느 쪽도 위의 메시지를 억제.

올바른 명령은 무엇입니까? 다음은 내 컴파일 라인입니다.

g++  -g -fno-inline -Wall -Werror -Wextra -Wfloat-equal -Wshadow
-Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wno-conversion 
-Wdisabled-optimization -Wredundant-decls -Wunused-value -Wno-deprecated 
-IC:\\boost_1_52_0 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 
-c -o op.o op.cpp

아마도 -Wall내 목표를 무시할까요?


오류 메시지가 거의 말했듯이 시도하십시오-Werror=no-unused-variable
Joachim Isaksson

답변:


236

-Wno-unused-variable스위치는 일반적으로 트릭을 수행합니다. 그러나 프로젝트에서 이러한 사항에 관심이 있다면 실제로 매우 유용한 경고입니다. GCC가 코드에없는 것에 대해 경고하기 시작하면 짜증이납니다.

경고를 유지하는 것이 좋지만 타사 프로젝트의 포함 디렉토리 -isystem대신 사용하는 것이 좋습니다 -I. 이 플래그는 GCC에게 사용자가 제어 할 수없는 항목에 대해 경고하지 않도록 지시합니다.

예를 들어 대신 -IC:\\boost_1_52_0이라고 말하십시오 -isystem C:\\boost_1_52_0.

도움이되기를 바랍니다. 행운을 빕니다!


이 설정을 어디에 추가할까요? "Project Settings / AVR GNU C Compiler / Miscellaneous"아래에 있었지만 무시됩니다 (경로가 정확하지만 여전히 경고가 표시됨) 디렉토리 설정에 추가 할 때 (상대 경로 확인란 선택 취소) AtmelStudio가 충돌합니다.
hfrmobile 2014

3
우리는 또한이 -Wno-unused-parameter사용되지 않는 함수 매개 변수에 대한 -Wno-unused-function사용되지 않는 기능에
Ngo의 탄 냔에게

1
당신이 필요합니다-Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable
로니 쉐러에게

82

때로는 일부 경고 만 억제하고 다른 경고는 유지하고 싶을 때가 있습니다. 코드에서 GCC의 unused 속성 을 사용하여 변수 및 공식 매개 변수에 대한 경고를 억제 할 수 있습니다 . 다음 코드 조각이 있다고 가정 해 보겠습니다.

void func(unsigned number, const int version)
{
  unsigned tmp;
  std::cout << number << std::endl;
}

이 함수를 핸들러로 사용해야하는 상황이있을 수 있습니다. (imho) C ++ Boost 라이브러리에서 매우 일반적입니다. 그런 다음 두 번째 형식 매개 변수 버전 이 필요 하므로 함수의 시그니처가 핸들러에 필요한 템플릿과 동일합니다. 그렇지 않으면 컴파일이 실패합니다. 그러나 함수 자체에서도 실제로 필요하지 않습니다.

경고에서 제외 할 변수 또는 형식 매개 변수를 표시하는 방법은 다음과 같습니다.

void func(unsigned number, const int version __attribute__((unused)))
{
  unsigned tmp __attribute__((unused));
  std::cout << number << std::endl;
}

GCC에는 다른 많은 매개 변수가 있으며 매뉴얼 페이지 에서 확인할 수 있습니다 . 이것은 C ++뿐만 아니라 C 프로그램에서도 작동하며 핸들러뿐만 아니라 거의 모든 함수에서 사용할 수 있다고 생각합니다. 어서 사용해보세요! ;)

추신 : 최근에 다음과 같은 템플릿에서 Boosts의 직렬화 경고를 억제하기 위해 이것을 사용했습니다.

template <typename Archive>
void serialize(Archive &ar, const unsigned int version __attribute__((unused)))

편집 : 분명히, 나는 당신이 필요로 당신의 질문에 대답하지 않았고, drak0sha 가 더 잘했습니다. 나는 주로 질문의 제목을 따랐기 때문입니다. 바라건대, 이것은 그 제목 때문에 여기에 오는 다른 사람들에게 도움이 될 수 있습니다 ... :)


7
형식 매개 변수의 경우 이름을 생략 할 수 있습니다 (예 : void func(unsigned number, const int). 그러면 gcc도 unused에 대해 불평하지 않습니다 version.
Olaf Dietsche 2016 년

@OlafDietsche 나는 이것이 gcc사용 중인 버전에 달려 있다고 생각합니다 . IIRC, 4 년 전에는 사용하지 않은 version. ;)
Dee'Kej

66

gcc를 사용 중이고 선택한 코드에 대한 경고를 비활성화하려면 #pragma 컴파일러 지시문을 사용할 수 있습니다.

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
( your problematic library includes )
#pragma GCC diagnostic pop

제어하는 코드의 경우 __attribute__((unused))특정 변수가 사용되지 않음을 컴파일러에 지시하는 데 사용할 수도 있습니다.



일반적으로 #pragma 지시문을 사용하는 것은 실제로 수행중인 작업을 알거나 병렬화를 위해 OpenMP를 사용하지 않는 한 안전하지 않다고 말합니다 ...;)
Dee'Kej

1
@ Dee'Kej #pragma지시문은 #ifdef some_compiler ... #endif. 경고는 컴파일러 관련 기능이며 표준에 의해 정의되지 않습니다. #pragmas 없이 코드에서 경고를 억제 할 수 없습니다 .
Kotauskas

@ vladislav-toncharov 컴파일러에 특정한 경고가 맞습니다. 그러나 여기서는 일반적으로 컴파일러 경고에 대해 이야기하는 것이 아닙니다. 특히 GCC에 대해 이야기하고 있습니다. 당신은 또한 #pragma가 말 당 해롭지 않다는 것에 대해 정확합니다. 그러나 IMO는 많은 사람들이 #pragma를 올바르게 사용하는 방법을 모르기 때문에 (더 나은 단어가 없기 때문에) "위험"하다고 생각합니다.
Dee'Kej

15

man gcc경고 옵션 아래를 참조하십시오 . 거기에 당신은unused

경고 옵션
... -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wunused-but-set-parameter -Wunused-but-set-variable

접두사에을 no-붙이면이 경고가 비활성화됩니다.

많은 옵션에는 -f 또는 -W ---로 시작하는 긴 이름이 있습니다 (예 : -fmove-loop-invariants, -Wformat 등). 이들 대부분은 긍정적 인 형태와 부정적인 형태를 모두 가지고 있습니다. -ffoo의 음수 형식은 -fno-foo입니다. 이 설명서는이 두 가지 양식 중 하나만 기본값이 아닌 양식 만 문서화합니다.

더 자세한 설명은 경고 요청 또는 억제 옵션에서 찾을 수 있습니다.


경고에 "no-"접두사를 붙일 수 있다는 것을 몰랐습니다.
RNA

10

사용 -Wno-unused-variable이 작동합니다.


아, 미사용 변수, 미사용 값이 아닙니다!
WilliamKF 2013

5
또는 -Wno-error=unused-variable오류를 제거하고 경고를 유지하려는 경우.
Oskar N.

1
실제 경고가 무엇인지 실제로 볼 수 있습니다 [-Werror=unused-variable].
Mats Petersson 2013

3

컴파일러는 이미 말하고 value있지만 variable. 을 찾고 있습니다 -Wno-unused-variable. 또한 g++ --help=warnings사용 가능한 옵션 목록을 확인하십시오.


3

gcc에서 나오는 사용하지 않는 변수 경고를 어떻게 비활성화합니까?
Windows의 부스트에서 오류가 발생하고 부스트 코드를 만지고 싶지 않습니다.

Boost의 Trac을 방문하여 Boost에 대한 버그 보고서를 제출합니다.

애플리케이션은 라이브러리 경고 및 오류를 지우는 책임이 없습니다. 라이브러리는 자체 경고 및 오류를 지울 책임이 있습니다.


0

-Wall-WextraGCC의 단계를 설정하고 이후는 -Wno-unused-variable적용되지 않습니다. 예를 들어 다음이있는 경우 :

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -Wall -Wextra \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ -Wno-unused-parameter \ -Wno-unused-variable \ $(INC)

그런 다음 GCC는 지침을보고 -Wall -Wextra무시하는 것처럼 보입니다.-Wno-unused-variable

대신 아래와 같이 보일 수 있으며 사용하지 않는 변수에 대한 컴파일에서 중지되지 않는 원하는 효과를 얻을 수 있습니다.

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ $(INC)

"경고"대 "오류"라고하는 좋은 이유가 있습니다. 코드가 완전하지 않기 때문에 컴파일에 실패하면 (예 : 알고리즘을 스터 빙하고 있음) 패배 할 수 있습니다.


-3
export IGNORE_WARNINGS=1

경고를 표시하지만 빌드를 계속합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.