“g ++ -Wall test.cpp -o test”의“-Wall”은 무엇을합니까?


92

-o 출력 파일 이름을 변경합니다 (--help를 사용하여 발견했습니다)

그러나 나는 무엇을 알 -Wall수 없습니까?


7
콘솔의 "사람 GCC는"...뿐만 아니라 당신이 플래그와 "gcc가 -Wall"간단한 구글 검색에 대한 모든 것을 알려줍니다
데이비드 사우

일반적인 팁 man으로 스위치의 기능이나 사용 가능한 스위치를 알고 싶다면 프로그램 항목을 읽어보십시오 . 의 man페이지는 linux.die.net/man/1/gcc에서gcc 읽을 수 있습니다. "-Wall"이라는 텍스트를 빠르게 검색 할 수 있습니다.
gnud

6
@David Sauter, Google은 "-wall"이있는 항목을 찾지 않습니다. 검색에서 모든 "벽"을 제외합니다.
Kirill V. Lyadvinsky 2010 년

@Kirill 당신이 따옴표를 사용한다면, 내가 데이비드가 의미하는 것처럼 추측하고있다
gnud

1
//, 저는 항상 그것이 Larry Wall에 대한 경의라고 생각했습니다.
Nathan Basanese 2015 년

답변:


110

"warn all"의 줄임말입니다. g ++가 알려줄 수있는 (거의) 모든 경고를 켭니다. 일반적으로 특히 초보자 인 경우 이러한 경고를 이해하고 수정하면 코드에서 여러 종류의 문제를 해결하는 데 도움이 될 수 있으므로 좋은 생각입니다.


24
(그 중 꽤 유용하다) 더 많은 경고와 켤 수 있습니다 -Wextra-pedantic.
gnud 2010 년

7
(거의) 전부가 아닙니다. 실제로는 사용 가능한 경고의 매우 작은 부분에 불과합니다. 그것은 "모두"가 동의하는 것들입니다. 정말 좋은 생각하는 것입니다 -Wall -Wextra, 다음 설명서를 정독 많은으로 찾아 도 있기 때문에, 당신은 가능한 수 있었다 경고 -Wextra... 일부분입니다
DevSolar

@DevSolar 아주 좋은 지적입니다. "말 그대로 모든 경고" 를 의미하는 플래그가 있는지 아십니까 ?
MatrixFrog 2014

1
@MatrixFrog : 불행히도 적어도 내가 아는 컴파일러에게는 그런 옵션이 없습니다. 사용 가능한 경고 목록은 시간이 지남에 따라 변경됩니다. GCC 팀이 -Wunreachable-code얼마 전에 비활성화하지 않았다면 Apple은 요즘 훨씬 더 행복 할 것 입니다. ;-)
DevSolar 2014

36

man gcc를 참조하십시오.

-Wall 은 다음 경고를 켭니다.

-Waddress -Warray-bounds (only with -O2) -Wc++0x-compat -Wchar-subscripts
-Wenum-compare (in C/Objc; this is on by default in C++) -Wimplicit-int (C and
 Objective-C only) -Wimplicit-function-declaration (C and Objective-C only) 
-Wcomment -Wformat -Wmain (only for C/ObjC and unless -ffreestanding) 
-Wmissing-braces -Wnonnull -Wparentheses -Wpointer-sign -Wreorder -Wreturn-type 
-Wsequence-point -Wsign-compare (only in C++) -Wstrict-aliasing 
-Wstrict-overflow=1 -Wswitch -Wtrigraphs -Wuninitialized -Wunknown-pragmas 
-Wunused-function -Wunused-label -Wunused-value -Wunused-variable 
-Wvolatile-register-var

-Wextra 는 다음을 포함합니다 :

-Wclobbered -Wempty-body -Wignored-qualifiers -Wmissing-field-initializers
-Wmissing-parameter-type (C only) -Wold-style-declaration (C only) -Woverride-init
-Wsign-compare -Wtype-limits -Wuninitialized -Wunused-parameter (only with -Wunused
 or -Wall) -Wunused-but-set-parameter (only with -Wunused or -Wall)

명시 적으로 켜야하는 더 많은 경고가 있습니다.

예를 들어 C 코드의 경우 다음을 사용합니다.

-Wall -Wextra -Waggregate-return -Wcast-align -Wcast-qual -Wdisabled-optimization -Wdiv-by-zero -Wendif-labels -Wformat-extra-args -Wformat-nonliteral -Wformat-security -Wformat-y2k -Wimplicit -Wimport -Winit-self -Winline -Winvalid-pch -Wjump-misses-init -Wlogical-op -Werror = missing-braces -Wmissing-declarations -Wno-missing-format-attribute -Wmissing-include-dirs -Wmultichar -Wpacked -Wpointer-arith -Wreturn-type -Wsequence-point -Wsign-compare -Wstrict-aliasing -Wstrict-aliasing = 2 -Wswitch -Wswitch-default -Werror = undef -Wno-unused -Wvariadic-macros -Wwrite-strings -Wc ++ -compat -Werror = 문 후 선언 -Werror = 암시 적 기능 선언 -Wmissing-prototypes -Werror = nested-externs -Werror = old-style-definition -Werror = strict-prototypes

또는 https://www.gnu.org/software/autoconf-archive/ax_compiler_flags.html 로 경고 세트


19

안타깝게도 매뉴얼의 실제 관련 부분을 인용하는 답변은 없습니다.

이를 통해 일부 사용자가 의심스럽고 피하기 쉬운 (또는 경고를 방지하기 위해 수정하기 위해 수정하는) 구성에 대한 모든 경고를 매크로와 함께 사용할 수 있습니다.

[...]

일부 경고 플래그는에 의해 암시되지 않습니다 -Wall. 그들 중 일부는 사용자가 일반적으로 의심스럽지 않지만 때때로 확인하고 싶은 구성에 대해 경고합니다. 다른 사람들은 어떤 경우에는 피해야하거나 피하기 어려운 구조에 대해 경고하며, 경고를 억제하기 위해 코드를 수정하는 간단한 방법이 없습니다. 이들 중 일부는에서 활성화 -Wextra 되지만 대부분은 개별적으로 활성화되어야합니다.

에르고 :

  • -Wall"모든 경고"를 의미 하지는 않습니다 .
  • 또한 않습니다 하지 아니라 장거리 슛으로 "모든 (거의)"을 의미한다.
  • 그것은 않는 개별 옵션의 집합을 의미 변경할 수밖에 없다 .

결론적으로, 설정해야하는 경고의 절대 최소값입니다. 하지만 -Wall -Wextra더 나은이지만, 여전히 당신을 위해 할 수있는 컴파일러 에러 체크 모든 사용을 아니에요.


개인적으로 나는 -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtual. 현재의 모든 프로젝트는 실제로 그보다 긴 경고 목록을 사용합니다 (아무것도 트리거하지 않음). 그리고 새로운 옵션에 대한 모든 주요 릴리스의 설명서를 확인합니다. 컴파일러는 당신의 친구입니다. 제공 할 수있는 모든 진단을 사용하십시오.


저는 C ++를 사용하여 프로그래밍을 배우기 시작했습니다. 내가 사용하고 원칙을 프로그래밍 및 CPP를 사용하여 연습 . 내 시스템은 우분투 16.04이며 vscode를 편집기로 사용합니다. C ++ 및 프로그래밍을 배우는 동안 -Wall -Wextra -Wfloat-equal -Wundef -Wcast-align -Wwrite-strings -Wlogical-op -Wmissing-declarations -Wredundant-decls -Wshadow -Woverloaded-virtual컴파일하는 g++ -std=c++11동안 사용하도록 권장 합니까? 아니면이 부분을 건너 뛰고 나중에 오류 메시지 플래그 사용을 시작해야합니까? 그렇다면 언제 오류 메시지로 시작해야합니까?
scientific_explorer

2
@vkv : 저는 컴파일러가 정말 당신의 친구라고 믿습니다. 그리고 당신은 그것이 당신에게 줄 수있는 좋은 조언을 조금씩 활용해야합니다.
DevSolar


2

그것 enables most warning messages.

을 사용하면 자세한 내용을 확인할 수 있습니다 g++ --help=warnings.


0

모든 경고를 활성화합니다. ( "모두 경고"로 표시)


실제로 활성화 할 수없는 경고가 많이 있습니다 (예 : 가상 메서드가있는 클래스의 비가 상 dtor).
Mark B

Yuval의 답변 참조 : -Wall"모든 경고"대신 "가장 많은 경고"를 의미합니다.
HaxtraZ

-1

모든 경고를 표시합니다. -pedantic코드의 일부 부적합한 부분에 대해 경고 하는데도 사용 하는 것이 좋습니다 .


gcc 문서의 경우 : "일부 사용자는 -pedantic을 사용하여 프로그램이 엄격한 ISO C 준수를 확인하는지 확인하려고합니다. 곧 원하는 작업을 수행하지 않는다는 사실을 알게됩니다. 일부 비 ISO 관행을 찾습니다. ISO C에는 진단이 필요하며 일부는 진단이 추가되었습니다. "
AProgrammer 2010 년

100 % 보장하지는 않지만 도움이됩니다.
Kirill V. Lyadvinsky 2010 년

1
당신이 작성하지 않았다면 일부 가 아닌 모든 "에 대해 경고하기에 모든 비 준수 부품"나는 댓글을 달았하지 않을 것입니다. 그러나 현재의 공식은 gcc 문서가 경고하는 오해를 퍼뜨 렸습니다.
AProgrammer 2010 년

결정된. 그러나 실제로는 "일부"가 아닌 "대부분"처럼 보입니다.
Kirill V. Lyadvinsky 2010 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.