2011-02-18 3 views
7

이것은 대개 발생하지 않는 GCC 특수 기능 모음을 시작하려는 나의 시도입니다. 이GCC 숨김/거의 알려지지 않은 기능

-WeffC++ 이 옵션은 "책"효과적인 C++ "과에 주어진 프로그래밍 가이드 라인의 일부를 나누기 C++ 코드에 대해 경고,"효과적인 C++ "g에 대한 옵션 ++ 언급 된 다른 문제 @jlebedev 다음에 오는 보다 효과적인 C++ "Scott Meyers. 예를 들어 동적으로 할당 된 메모리를 사용하는 클래스가 복사 생성자와 할당 연산자를 정의하지 않으면 경고가 표시됩니다. 표준 라이브러리 헤더 파일은이 지침을 따르지 않으므로이 옵션을 사용하여 항상 컴파일하는 것이 아니라 자체 코드에서 발생할 수있는 문제에 대한 가끔 테스트로 사용할 수 있습니다.

다른 유용한 기능이 있습니까?

답변

1

'반환 값'문없이 함수를 끝내는 코드 경로를 따라 가면 값 (예 : int)을 반환하는 함수는 임의의 값을 반환합니다. 주의를 기울이지 않으면 예외가 발생하고 범위를 벗어난 메모리 쓰기 또는 읽기가 발생할 수 있습니다.

예를 들어 함수를 사용하여 배열에 색인을 가져오고 잘못된 코드 경로 ('value'문으로 끝나지 않는 코드 경로)가 사용되면 임의의 값이 반환됩니다. 배열의 인덱스로 너무 커서 스택이나 힙을 엉망으로 만들 때 모든 종류의 두통을 초래할 수 있습니다.

5

가끔씩 현재 GCC/G ++ 명령 행 매개 변수 문서를 살펴보고 컴파일러 스크립트를 업데이트하여 모든 종류의 코딩 오류에 대해 편집증을 적용합니다. 관심이 있으시면 Here it is을 클릭하십시오.

불행히도 나는 대부분 잊어 버렸으므로 문서를 작성하지는 않았지만 - 철석, - 벽감, - 우물, + 그림자, - 비 - 가상 - dtor, - 와일드 스타일 - 캐스트, 오버 로딩 된 가상 , 그리고 몇 가지 다른 것들은 잠재적으로 위험한 상황을 경고하면서 항상 유용합니다. 나는 커스터마이즈 기능의 측면을 좋아합니다. 깨끗하고 정확한 코드를 작성해야합니다. 그것은 잘 복무했다.

그러나 두통이없는 것은 아닙니다. 특히 -WeffC++입니다. 몇 가지 예 :

  • 가비지 수집을 사용하므로 쓸모없는 클래스 멤버에 포인터가있는 경우 사용자 지정 복사본 생성자와 할당 연산자를 제공해야합니다. 그래서 비어있는 개인용 버전을 선언해야합니다.
  • 내 인스턴스화되지 클래스 (하위 클래스의 인스턴스 생성을 방지) G ++는 경우 T의 하위 클래스를 방지 "단지 개인 생성자없이 친구"
  • Final<T> 클래스 (에 대해 우는 소리를하지 않았다, 그래서 더미 개인 친구를 구현했다 T는 사실상 파생 됨) 표준 T는 템플릿 매개 변수를 사용하지 못하기 때문에 T를 개인 래퍼 클래스로 랩핑하여 친구로 선언해야했습니다.
  • G ++은 결코 반환 값을 반환하지 않는 함수를 인식하고 대신 예외를 throw하고 noreturn 특성으로 선언되지 않은 함수에 대한 호출을 허용합니다. 항상 진실한 지시 뒤에 숨어 있으면 G ++가 너무 영리해서 인식되었습니다. 가변 변수를 선언하고 그 값과 비교하여 예외를 무시하지 않을 수있게하기 위해 잠시 생각났습니다.
  • 부동 소수점 비교 경고. 오 세상에. 나는 주위에 x < = y와 x> = y 대신 x == y를 써서 해결해야한다.
  • 섀도 잉 가상.좋아, 이것은 하위 클래스의 어리석은 섀도 잉/과부하 문제를 방지하는 데 유용하지만 여전히 성가시다.
  • 함수에 대한 이전 선언이 없습니다. Kinda는 함수 선언을 바로 위에 복사하기 시작하자마자 중요성을 잃었습니다.

조금 어색함이 들리 겠지만, 전체적으로 C++ 및 일반적인 프로그래밍에 대한 이해가 높아진 매우 멋진 기능입니다.

G ++에는 다른 멋진 기능이 있습니까? 글쎄, 그것은 자유롭고 개방적이며, 가장 널리 사용되고 현대적인 컴파일러 중 하나이며, 지속적으로 경쟁사보다 뛰어나다. 사람들이 거의 모든 것을 먹을 수 있고, 거의 모든 플랫폼에서 사용할 수 있으며, 지옥에 맞게 사용자 정의가 가능하고 지속적으로 개선되며 광범위한 커뮤니티가있다. 싫어하는게 뭐야?

관련 문제