C++11용 gcc 옵션

보존용 C++11용 gcc 옵션

#c++ #gcc

jacking75 님이 너무 예쁘게 만들어 주신 내용이 있어서, 나중에 기록을 해 놓을 용으로 옮겨 놓는다.

원본: https://qiita.com/janus_wel/items/07140fcd1127b568087d

C++11 - C++11용 gcc 옵션

옵션 효과
-std = c ++ 11 대상 소스가 C++ 11 기준으로 컴파일
-Wall 기본 경고 옵션을 on으로 한다
-Wextra 추가 경고 옵션을 on으로 한다
-pedantic ISO C/C++에 존재하지 않는 문법 경고
-Wcast-align char* 에서 int* 같은 정렬 길이가 커지는 캐스트 경고
-Wcast-qual const char *을 char *로 캐스팅 하는 등 형식 한정자를 벗어나는 경우에 경고
-Wconversion 암시적 캐스트 및 형식 변환이 실시된다고 경고
-Wdisabled-optimization 컴파일시 최적화가 도중에 중단된다고 경고
-Wendif-labels #else FOO와 #endif FOO 등 주석을 달아야할 위치에 식별자가 있다고 경고한다
-Wfloat-equal 부동 소수점 숫자를 == 로 비교하고 있다고 경고한다
-Winit-self int i = i; 같은 정의되지 않은 변수가 자신을 초기화 하면 경고
-Winline inline 지정된 함수가 인라인 되지 않은 경우에 경고
-Wlogical-op 비트 연산자가 맞는 곳에 논리 연산자를 이용한 경우에 경고
-Wmissing-include-dirs 사용자가 지정한 include 디렉토리가 존재하지 않는 경우에 경고
-Wnon-virtual-dtor 가상 함수를 가지고 있는 비 가상 소멸자를 가진 클래스를 정의하면 경고
-Wold-style-cast C 언어 형식의 캐스팅을 경고한다
-Woverloaded-virtual 부모 클래스의 가상 멤버 함수를 가려 버리는 멤버 함수를 정의하면 경고
-Wpacked packed attribute이 구조체나 클래스에 지정 되어 있지만, 지정되지 않은 경우와 크기가 바뀌지 않을 경우에 경고
-Wpointer-arith 함수형이나 void 포인터, NULL에 대한 수치 계산을 하면 경고
-Wredundant-decls 같은 범위에서 동일한 기호를 여러 번 선언 하면 경고
-Wshadow 로컬 변수와 형식 선언이 다른 변수, 매개 변수, 타입, 클래스 멤버 내장 함수를 숨기면 경고한다
-Wsign-promo 오버로드 해결 시 unsigned / 열거 타입에서 동일한 크기의 unsigned를 통해 signed로 승격하면 경고
-Wswitch-default switch 문에 default case가 없으면 경고
-Wswitch-enum 열거 타입의 case를 가지는 switch 문에서 이 열거 타입 중 하나 이상의 값이 case로 정의되어 있지 않으면 default case가 있어도 경고
-Wunsafe-loop-optimizations 종료 조건을 가정 할 수 없고 루프를 최적화 할 수 없는 경우에 경고
-Wvariadic-macros 가변 인자 매크로가 ISO C90 모드에서 사용되면 경고
-Wwrite-strings 문자열 리터럴 형식 const char을 char로 변환하면 경고

##

-Wall 내역

옵션 효과
-Waddress 함수 포인터를 조건식에 사용하는 등 이상한 포인터 사용을 경고한다
-Warray-bounds 배열에 범위를 벗어난 첨자 지정을 한 경우 경고 -O2와 동시에 지정된 경우에만 유효
-Wc++11-compat ISO C++ 1998에서 ISO C++ 2011까지와 다른 소스의 경우에 경고
-Wchar-subscripts 배열의 첨자를 char 타입으로 지정한 경우에 경고
-Wenum-compare 다른 열거 타입 값끼리 비교 한 경우에 경고
-Wcomment /가 / 주석에 나타난 경우 백 슬래시가 // 주석의 마지막에 나타날 경우 경고
-Wformat printf 같은 형식의 서식 지정 순서에 변수 인수와 수가 다르거나 적절하게 변환 할 수 없는 경우에 경고
-Wmaybe-uninitialized 자동 변수가 초기화 되지 않는 루트가 있는 경우에 경고
-Wmissing-braces int a[2][2] = {0, 1, 2, 3}; 등 집계나 공용체의 초기화에 괄호를 생력하면 경고
-Wnonnull nonnull 속성이 붙은 함수에 null 포인터를 전달하면 경고
-Wparentheses 중첩 된 if 문에서 else 등 괄호가 없으면 혼란스러운 맥락에서 괄호를 생략하면 경고
-Wreorder 멤버 이니셜 라이저 순서가 선언과 다른 경우 경고
-Wreturn-type 함수의 반환 형식이 지정되어 있는데 값 없는 return을 하는 등 return 관한 이상한 코드 경고
-Wsequence-point n = n++; 등 평가 순서에 따라 결과가 달라질 코드 경고
-Wsign-compare singed 타입과 unsigned 타입의 비교에서 singed 타입을 unsigned 타입으로 변환하면 결과가 이상 해지는 코드 경고
-Wstrict-aliasing int x = 0; short* y = (short *)&x; 등 무리한 형식 변환에 의해 컴파일러가 최적화 할 수 없는 경우에 경고
-Wstrict-overflow = 1 부호있는 오버플로가 발생하지 않는다고 가정한 최적화가 실시된다고 경고
-Wswitch-enum 열거 타입의 case를 가지는 switch 문에서 이 열거 타입 중 하나 이상의 값이 case로 정의되어 있지 않다면 경고. default case가 있으면 ok
-Wtrigraphs 프로그램의 의미를 바꿀 수 있는 트라이 그래프가 코드에 포함 되어 있다고 경고한다
-Wuninitialized 비 static 참조 및 비 static const 멤버 변수를 생성자가 없는 클래스에 정의되어 있다고 경고한다
-Wunknown-pragmas gcc가 인지하지 못하는 #pragma 지시어가 존재하는 경우에 경고
-Wunused-function static 함수를 선언하고 정의 되어 있지 않거나 비 inline의 static 함수가 사용되지 않은 경우에 경고
-Wunused-label 사용되지 않는 레이블이 있다고 경고한다
-Wunused-value i = (1, 2, 3); 같은 결과를 계산하는 글이 명시적으로 사용되지 않은 경우에 경고
-Wunused-variable 로컬 변수와 비 const의 static 변수가 선언되어 있지만 사용되지 않은 경우에 경고
-Wvolatile-register-var 레지스터 변수가 volatile 수식하는 경우에 경고

-Wextra 내역

옵션 효과
-Wclobbered longjmp와 vfork에 의해 변수가 변경 될지도 모르는 경우에 경고
-Wempty-body if, else, do while 문장의 본체가 없는 경우 경고
-Wignored-qualifiers const int a(); 같은 함수의 반환 형식이 const 등의 형태 수식자를 가지는 경우에 경고
-Wmissing-field-initializers 정의된 필드 수에 비해 구조체 이니셜 라이저의 수가 적은 경우에 경고
-Wsign-compare singed 타입과 unsigned 타입의 비교에서 singed 타입을 unsigned 타입으로 변환하면 결과가 이상 해지는 코드 경고
-Wtype-limits unsigned int a; if (a <0) 과 같이 데이터 타입의 범위가 한정되어 있기 때문에 비교가 항상 참 또는 거짓이 되는 경우에 경고
-Wuninitialized 비 static 참조 및 비 static const 멤버 변수를 생성자가 없는 클래스에 정의되어 있다고 경고한다
-Wunused-parameter 함수 인수가 정의되어 있지만 사용되지 않은 경우에 경고
-Wunused-but-set-parameter 함수에 인수가 전달되고 있지만 사용되어 있지 않은 경우에 경고

다음의 경우도 경고

- 포인터를 정수 값 0과 아래 비교 연산자로 비교한 경우

<

<=

>

>=

- 열거 값과 비 열거 값이 조건식에 동시에 나타난 경우

- 애매한 가상 기본 클래스

- register와 함께 선언된 배열 첨자 지정

- register 함께 선언된 변수의 포인터 취득

- 상속된 클래스에서 기본 클래스가 초기화 되어 있지 않은 경우