"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > C/C ++의 사용하지 않는 변수 : 왜 그리고 어떻게?

C/C ++의 사용하지 않는 변수 : 왜 그리고 어떻게?

2025-02-06에 게시되었습니다
검색:151

Unused variables in C/C  : why and how?

C/C 코드를 검토 할 때 사용되지 않는 변수를 상당히 찾습니다. 이러한 미사용 변수는 여러 가지 이유로 발생합니다. 이 게시물에서는 미사용 변수가 C/C 코드에서 발생하는 이유 중 일부를 살펴 봅니다. 우리는 사용하지 않는 변수에 대한 컴파일러가 경고하는 방법과 특정 사용하지 않은 변수에 대한 경고를 억제하는 방법을 검토합니다.

변수가 사용되지 않은 이유

사용하지 않은 변수가 코드 기반에 남아있을 수있는 많은 이유가 있습니다.
  1. 버그 및 실수

    : 사용하지 않는 변수의 가장 분명한 이유는 결함이있는 코드입니다. 변수는 실제로 필요하지 않고 제거 할 수 있거나 변수가 필요하지만 몇 가지 중요한 지점에서 사용하는 것을 잊었습니다.
  2. Refactoring :

    소프트웨어가 작성되고 다시 작성 될 때 코드의 전체 섹션이 제거 될 수 있습니다. 보조 계산 결과와 같이 코드에 한 번 중요한 변수는 남겨두고 사용하지 않을 수 있습니다.
  3. 미래 방지 :
  4. 사용하지 않은 변수는 과거 코드의 유산뿐만 아니라 미래 코드의 유산으로도 발생할 수 있습니다. 아직 기록되지 않은 코드를 기대하면 변수를 선언 할 수 있습니다.

  5. 조건부 편집 :

    변수는 사전 처리기 단계에 따라 사용되지 않은 상태로 유지 될 수 있습니다. 표준 예제는 디버그 목적으로 만 정의 된 변수입니다. 코드는
  6. 형식의 무언가를 포함 할 수 있습니다.
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);

-dndebug로 컴파일하면 컴파일러는 value_for_comparison_only가 사용되지 않는다고 경고 할 수 있습니다. 실제로, Assert 진술은… 아무것도 대체되었습니다.

사용하지 않은 변수를 감지하는 방법

다른 컴파일러 및 경고 레벨 설정은 컴파일 프로세스 중에 변수가 사용하지 않는 것으로보고되는지 여부에 영향을 줄 수 있습니다.

예를 들어, GCC와 Clang은 미사용 변수에 대한 경고를 트리거하는 -Wunused -Variable 플래그를 특징으로합니다. 플래그는 이미 -wall 경고 옵션에 의해 암시되며 -wno -Unused -Variable을 통해 꺼질 수 있습니다.

내 권장 사항은 항상 -wall로 컴파일 한 다음 허용되는대로 경고를 선택적으로 끄는 것입니다. 이것은 사용되지 않은 변수의 모든 인스턴스가됩니다.

사용하지 않는 변수를 감지하지 않는 방법 : 속성

우리는 항상 가능한 한 많은 경고를 가능하게하는만큼 컴파일해야하지만, 미사용 변수에 대한 경고를 선택적으로 끄고 싶은 상황이 있습니다. 그렇게하는 인기있는 방법은 무효로하는 캐스트입니다 :
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) 사용으로 계산되므로 경고가 방출되지 않습니다.

이것은 Unused_object가 사용하지 않는 경고를 제거하지만 의도 한대로이를 개선 할 수있는 방법이 있습니다. 우리는이 공허 주사가 사용되지 않은 대상을 의미한다는 명백한 의미론을 원합니다. 일반적인 방법은 매크로를 정의하는 것입니다 :
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);

한 가지 장점은 이제이 변수의 의도 (또는 그 부족)를 명시 적으로 전달한다는 것입니다. 또한 사용하지 않은 변수의 코드를 제거하기로 결정하면 훨씬 쉽습니다.

매크로를 넘어서서, 우리는 가변적 인 속성을 가지고 있습니다 : 언어 C 원래 또는 C/C 컴파일러가 제공하는 언어 확장으로. 예를 들어, Clang 및 GCC는 변수 속성 __attribute __ ((UNUSS))를 허용합니다. C 17은 [[mays_unused]] 속성을 지원합니다 :
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);

복잡한 계산의 결과가 사용되지 않더라도 주위에 유지하는 것은 또 다른 실패 지점을 구성합니다. 그리고 이것이 바로 디버깅 중에 원하는 것입니다. 원래 디버깅을 의도하지 않더라도 프로그램 이이 변수를 초기화하도록하는 것이 필요하다고 결정하면 도움이됩니다 (다시).

사용하지 않은 변수에 대한이 게시물이 귀하에게 유용하기를 바랍니다.

Unused variables in C/C  : why and how?

릴리스 선언문 이 기사는 https://dev.to/martinlicht/unused-variables-in-cc-why-and-4cm4에서 재현됩니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3