2012-04-14 2 views
20

C++ 컴파일러가 const의 정확성을 강화하는 데 도움이된다는 경고를 아는 사람이 있습니까? 예를 들어, 메소드 내에서 결코 수정되지 않는 non-const 매개 변수를 포함하는 C++ 메소드에서 경고를 생성하는 것이 좋습니다. 나는 GNU 컴파일러 경고 (-Wsuggest-attribute = const; 그러나이 플래그를 사용할 때 인식되지 않는다는 오류가 발생합니다. 어떤 아이디어?Const 정확성 경고 C++

+0

"CONST 정확성은"하지 않습니다 메소드 인자 나 지역 변수와 관련이 있습니다. cppcheck는 const로 만들 수있는 클래스 메소드에 대해 스타일 경고를 내보낼 수 있습니다. –

+0

'-Wsuggest-attribute'는 const 정확성이 아니라 GCC 관련 함수 속성에 관한 것입니다. '__attribute __ ((const))'는'constexpr'과 다소 비슷합니다. – Philipp

답변

6

나는 그런 경고가 존재하지 않는다고 생각한다. 왜냐하면 대부분 쓸모가 없기 때문이다. 매개 변수가 호출 내에서 수정되지 않았기 때문에 단지이를 위해서 const을 만들어야한다는 것을 의미하지는 않습니다.

virtual의 기능을 생각해보십시오. 아마도 기본 클래스의 디자이너는 기본 클래스의 매개 변수를 수정하지 않더라도 해당 매개 변수를 수정할지 여부를 확장 클래스에 맡기를 원할 것입니다.

또한 인터페이스 또는 API 또는 기타 비용을 많이 수정하는 대규모 응용 프로그램을 생각해보십시오. 나중에 매개 변수를 수정할 필요는 없지만 나중에 매개 변수를 수정하려고 할 수 있습니다. 이제는 const으로 만들지 않으려 고하고 완전히 다시 빌드해야하며 나중에 const을 제거하면 오류가 발생할 수 있습니다.

+2

나는 당신의 요점을 본다; 그러나, 나는 여전히 이것이 경고 (아마도 오류가 아님)로서 유용하다고 생각한다. 게다가, gnu 컴파일러에 -Wsuggest-attribute = const라는 플래그가있는 것 같습니다. 하지만 내 g ++ 컴파일러는 그것을 인식하지 못합니다. – user809409

+0

필자가 컴파일러에서 실행을 떠나야 할 기능은 아니지만 지금은 언제든지 켜고 제안을 검토하는 것이 좋습니다. 함수가 변수를 수정하지 않는다는 것을 알고 있다면 const 변수를 전달할 수 있도록 const로 만드는 것이 좋습니다. – Darinth

+0

[Rust] (https://www.rust-lang.org/en -US /)이이 기능 (불필요한'mut')을 가지고 있으며, C++로 다시 돌아가 API 및 로컬 변수가 기본적으로 불변임을 확인하려고합니다. – phoenix

0

아니요, 불행히도 그러한 경고가 없습니다. const 선언 된 매개 변수를 변경하려고하면 오류가 발생합니다. 이는 누락 된 const 선언이 컴파일러 관점에서 코드의 정확성을 변경하지 않기 때문입니다. 그러나 const 정확성은 컴파일러가 잠재적 인 최적화를 발견하는 데 중요하며 코드의 가독성을 향상시킵니다. 그것은 전문성의 문제입니다. 특히 참조를 사용할 때 정확성은 필수입니다. I often refer to this.
연산자 (할당, 변환, ...)가 작동 할 때 컴파일러 자체가 const 정확성을 매우 중요하게 생각합니다. 누락 된 const 및 컴파일러는 주어진 매개 변수가 수정 될 수있는 경우 큰 차이를 만들기 때문에 연산자 사용을 거부합니다.

5

주의,이 같은 const 매개 변수 :

void myFunc(int const param); 

하지 인터페이스에 속하지 않습니다. 함수 구현의 로컬 범위에 속합니다. 사실,이 기능 :

int inc(int const param) { return param+1; } 

그것은 변수를 수정할 수있는 권리를 주장 할 수있는 CONST 정확성 패러다임 위반이 아닌

int inc(int param); 

로 선언하지만 실제로 그것을 할 수 있습니다.

const_cast이 걱정된다면 처음에는 사용하지 않거나 코드 기반에 grep 만 사용할 수 있습니다.

0

저는 이러한 경고를 알지 못합니다. 컴파일러에서 구현하기가 다소 어려울 것입니다. 즉 속도가 느려질 것입니다. 어쩌면 일부 정적 분석 도구에는 이러한 기능이있을 수 있습니다 (그러나 그 중 일부는 인식하지 못합니다).

Wsuggest-attribute=const에 따르면, 그것은 다른 것입니다. gcc 고유의 "함수 속성 const"을 사용하는 것이 좋습니다.이 함수는 값 (포인터 없음) 만 받고, 정적/전역 상태를 읽거나 변경하지 않고 값만 반환 (포인터 없음)하는 수학적 함수입니다. .자세한 설명은 이쪽을 봐 : https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes

0
-Wsuggest-attribute=const 

이 분석에서 기본적으로 활성화되어 있습니다 옵션을

-fipa-pure-const 

필요

-O 

높은