C/C 코드를 검토 할 때 사용되지 않는 변수를 상당히 찾습니다. 이러한 미사용 변수는 여러 가지 이유로 발생합니다. 이 게시물에서는 미사용 변수가 C/C 코드에서 발생하는 이유 중 일부를 살펴 봅니다. 우리는 사용하지 않는 변수에 대한 컴파일러가 경고하는 방법과 특정 사용하지 않은 변수에 대한 경고를 억제하는 방법을 검토합니다.
사용하지 않은 변수가 코드 기반에 남아있을 수있는 많은 이유가 있습니다.
버그 및 실수
: 사용하지 않는 변수의 가장 분명한 이유는 결함이있는 코드입니다. 변수는 실제로 필요하지 않고 제거 할 수 있거나 변수가 필요하지만 몇 가지 중요한 지점에서 사용하는 것을 잊었습니다.Refactoring :
소프트웨어가 작성되고 다시 작성 될 때 코드의 전체 섹션이 제거 될 수 있습니다. 보조 계산 결과와 같이 코드에 한 번 중요한 변수는 남겨두고 사용하지 않을 수 있습니다.미래 방지 :
조건부 편집 :
const auto value = compute_some_value(); const auto value_for_comparison_only = compute_same_value_differently(); assert( value == value_for_comparison_only );
const auto value = compute_some_value (); const auto value_for_comparison_only = compute_same_value_differely (); assert (value == value_for_comparison_only);
사용하지 않은 변수를 감지하는 방법
다른 컴파일러 및 경고 레벨 설정은 컴파일 프로세스 중에 변수가 사용하지 않는 것으로보고되는지 여부에 영향을 줄 수 있습니다.
예를 들어, GCC와 Clang은 미사용 변수에 대한 경고를 트리거하는 -Wunused -Variable 플래그를 특징으로합니다. 플래그는 이미 -wall 경고 옵션에 의해 암시되며 -wno -Unused -Variable을 통해 꺼질 수 있습니다.
사용하지 않는 변수를 감지하지 않는 방법 : 속성
const auto value = compute_some_value(); const auto value_for_comparison_only = compute_same_value_differently(); assert( value == value_for_comparison_only );
객체 unused_object; (void) unused_object;
캐스트 void 카스트는 변수의 (Pro Forma) 사용으로 계산되므로 경고가 방출되지 않습니다.
const auto value = compute_some_value(); const auto value_for_comparison_only = compute_same_value_differently(); assert( value == value_for_comparison_only );
#define define unised (x) (void) (x); // ... 객체 unused_object; 미사용 (unused_object);
한 가지 장점은 이제이 변수의 의도 (또는 그 부족)를 명시 적으로 전달한다는 것입니다. 또한 사용하지 않은 변수의 코드를 제거하기로 결정하면 훨씬 쉽습니다.
const auto value = compute_some_value(); const auto value_for_comparison_only = compute_same_value_differently(); assert( value == value_for_comparison_only );
Object Unused_Object2 __attribute __ ((Unused)) = x; // 선언 후에 배치해야합니다 [[Mays_Unused]] 객체 unused_object1 = x; // 선언 전에 배치해야합니다
이러한 속성은 컴파일러 (및 미국)에게 이러한 변수가 사용되지 않을 수 있고 우리는 그에 맞는 것이 좋습니다.
역사적으로, GCC 속성이 먼저 나타 났으며 C 및 C에서 컴파일러 별 언어 확장자입니다. C 17부터 속성은 언어 표준의 일부입니다. 그러나 철자는 다를뿐만 아니라 표준과 GCC 확장은 속성을 어디에 배치 해야할지 동의하지 않습니다.
[[mays_unused]] 속성은 조건부 편집을 통해 대부분의 응용 프로그램을 찾을 수 있습니다. 예를 들어, 디버그 전용 변수의 자연 속성입니다. 순수한 미적 이유로, 나는 개인적으로 매크로 #define maygre_unused [[mays_unused]]를 정의하는 것을 선호합니다. __attribute __ ((Unused))의 장점은 변수가 코드에 사용되면 실제로 경고 할 것입니다. 어쩌면 사용하지 않은 는 아니지만
는 확실히 사용되지 않으며 변수를 사용하면 경고가 생성됩니다.쓸모없는 것들을 유지합니다
분명히, 사용되지 않은 변수는 자주 자신의 언어 확장을 보증하기에 충분히 빈번하고 중요합니다.
이에 비해, 사용하지 않는 변수를 좋은 전략으로 언급하고 있습니까? 항상! 개발 코드와 디버깅 단계 전체에서 사용되지 않는 변수를 유지 해야하는 이유가 있습니다. 변수가 코드의 과거 버전에서 사용되었다고 가정 해 봅시다. 이전 코드가 선반으로 표시되어 있는지 또는 재 통합되어야하는지 여부를 아직 결정하지 않았을 수도 있습니다. 의미 : 사용하지 않은 변수가 다시 필요한지 여부를 모릅니다.
const auto value = compute_some_value(); const auto value_for_comparison_only = compute_same_value_differently(); assert( value == value_for_comparison_only );
auto unused_variable __attribute __ ((uned)) = 복잡한 _calculation (arg1, arg2, arg3);
복잡한 계산의 결과가 사용되지 않더라도 주위에 유지하는 것은 또 다른 실패 지점을 구성합니다. 그리고 이것이 바로 디버깅 중에 원하는 것입니다. 원래 디버깅을 의도하지 않더라도 프로그램 이이 변수를 초기화하도록하는 것이 필요하다고 결정하면 도움이됩니다 (다시).
사용하지 않은 변수에 대한이 게시물이 귀하에게 유용하기를 바랍니다.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3