programing

C에서 정의되었지만 사용되지 않은 기능 경고

topblog 2023. 6. 7. 22:05
반응형

C에서 정의되었지만 사용되지 않은 기능 경고

C 소스 파일(.c 파일과 .h 파일 모두)이 여러 개 있습니다.헤더 파일에는 여러 가지 함수가 포함되어 있습니다.이러한 기능 중 일부만 소스 .C 파일에서 사용됩니다.a.h,b.h가 헤더 파일이고 a.c 및 b.c가 .c 파일이고 a.h가 a.c에 포함되어 있다고 가정합니다.그러나 a.h에 있는 많은 기능만 사용되고 나머지는 사용되지 않습니다.컴파일 후 다음과 같은 경고가 나타납니다.

 function XXXX defined but not used.

그러나 AC에서 사용되지 않는 XXXX 함수는 BC에서 사용됩니다.그래서 저도 그 기능들을 완전히 제거할 수 없습니다.그래서 저는 이러한 XXXX 기능만 포함된 별도의 파일을 만들기로 결정했고 사용되는 곳마다 포함시켰습니다.이렇게 하면 여러 개의 헤더 파일이 만들어집니다.이 문제를 해결할 수 있는 효과적인 방법을 저에게 제안해 주실 수 있나요?

"기능이 정의되었지만 사용되지 않음" 경고는 내부 연결이 있는 기능, 즉 다음과 같이 선언된 기능에 대해서만 발행됩니다.static이러한 함수는 하나의 번역 단위에서만 액세스할 수 있으므로 컴파일러는 항상 해당 함수가 (프로그램에서) 사용되는지 여부를 확인합니다.이러한 기능을 번역 단위에서 참조하지 않으면 이러한 기능은 사용되지 않는 것으로 알려져 경고가 생성됩니다.

당신은 이 함수들이 "교류에서 사용되는 것이 아니라 b.c에서 사용된다"고 말하고 있습니다.이것은 사실이 아닙니다.함수를 다음과 같이 선언(및 정의)할 때static헤더 파일에서 해당 헤더 파일을 포함하는 각 변환 장치는 함수의 자체 내부 복사본을 가져옵니다.이러한 기능은 완전히 동일하게 보이지만, 여전히 별도의 완전히 독립적인 기능입니다.이름이 같고 코드가 같다는 것은 컴파일러에게 아무런 의미가 없습니다.그래서.b.c당신은 (당신이 말한 것처럼) 사용되는 함수의 완전히 독립적인 복사본을 얻었지만, 완전히 독립적인 복사본은.a.c여전히 사용되지 않습니다.

이 경우의 문제는 당신이 왜 이것을 하고 있느냐는 입니다.도대체 헤더 파일에 정적 함수를 정의하는 이유는 무엇입니까?이 작업이 정말로 필요한 경우(즉, 각 번역 단위에서 이 함수의 별도의 내부 "클론"을 생성하려는 경우) 컴파일러별 방법을 사용하여 경고를 피할 수 있습니다.예를 들어, GCC에서와 같이, 다음과 같이 함수를 선언할 수 있습니다.__attribute__((unused))이 기능에 대한 경고가 더 이상 발행되지 않습니다.

그러나 일반적으로 헤더 파일에 함수를 정의할 필요는 없습니다.일반적으로 외부 링크가 있는 함수를 사용합니다(예: no).static .c 중 파일에 을 넣습니다."), .c 파 중 일 하 키 을 파 에 에 선 일 다 넣 습 니 드 언 prototype 헤 워 더 하 고 나 의 정 서 ▁), 을 ▁define ▁the 다 키 니 습 prototype ▁put 넣 ▁and c ▁in ▁it ▁file ▁. ▁in ▁declar이 경우 함수가 선언되었지만 일부 변환 단위에서 사용되지 않더라도 컴파일러는 경고를 표시하지 않습니다.

경고를 숨기려는 경우 다음을 사용합니다.

-Wno-unused-function

하지만, 여러분은 아마도 카페의 대답에 있는 조언을 따라야 할 것입니다.선언만 추가하려고 했을 때 함수를 정의했을 수도 있습니다.

다른 을 또다른가이함다을음같것과이다입니정는으로 정의하는 입니다.inlinestatic이 경우 헤더에 정의를 정의하여 호출되는 모든 위치에서 정의를 볼 수 있도록 해야 합니다.

컴파일러는 함수가 사용되는 각 위치에 코드를 인라인으로 연결하므로 이것이 당신이 정말 원하는 것인지 주의해야 합니다.여기 이러한 절충안에 대한 멋진 논의와 함께 답변이 있습니다.

사용하지 않는 기능 경고를 최대 3개까지 트리거하는 기능 집합인 "Don't do it's"

static int get_version_number(void) { return 42; }
static double hidden_global_variable(void) { return 3.14; }
static int potential_alternative_to_macro(int x) { return 4 * x; } 

헤더 파일의 이름을 기반으로 다른 함수를 작성합니다.

static void wno_unused_myheadername(void)
{
  /* don't need to actually call the functions to avoid the warnings */
  (void)&get_version_number;
  (void)&hidden_global_variable;
  (void)&potential_alternative_to_macro;
  return;
 }

이제 사용하지 않는 기능 경고 하나로 요약됩니다.헤더가 포함된 파일에 선언된 외부 함수 중 하나에 wno_unused_myheadername() 호출을 추가하면 사용되지 않는 함수 경고의 전체 집합이 사라집니다.이제 다 쓰였으니까요.

컴파일러는 모든 정의를 볼 수 있고 wno_unused_myheadname을 포함하여 사용되지 않는 함수 중 아무 것도 제거하지 않습니다. wno_unused 함수에 대한 단일 호출이 실제로 아무것도 수행하지 않는다고 판단할 수 있기 때문입니다.

위의 내용이 clang과 gcc에서 예상대로 경고를 제거하는 것을 확인했는데, 당신의 마일리지는 다른 컴파일러에 따라 다를 수 있습니다.저는 거의 사용하지 않는 기능이 언제 제거되는지 조사하기 위해 assm 출력을 보지 못했습니다.

그 이유에 대해 말하자면 - 좋은 이유는 컴파일러에서 링크 시간 최적화를 요구하지 않고 인라인 키워드가 없는 C89에서 인라인에 적합한 작은 함수를 많이 사용하는 것입니다.

당신의 문제는 당신이 기능을 정의하고 있다는 것처럼 들립니다..h파일, 그러지 마요.대신, 당신의 선언문을 다음에 넣으십시오..h파일, 그리고 일치하는 것이 있습니다..c함수 정의를 포함하는 파일:

공통.h:

#ifndef _COMMON_H
#define _COMMON_H

int foo(int a, int b);

int bar(double x, double y, double z);

#endif /* _COMMON_H */

common.c:

#include "common.h"

int foo(int a, int b)
{
    /* code */
}

int bar(double x, double y, double z)
{
    /* code */
}

당신의 그럼당신의.a.c그리고.b.c 할 것#include "common.h"그리고 당신은 그것을 가질 준비가 필요할 필요가 있을 것입니다.common.c완전한 프로그램으로 컴파일되었습니다.

.h 파일의 정적 함수 정의가 C에서 매우 좋은 유형의 매크로를 만든다는 것은 아무도 언급하지 않는 것 같습니다.저는 그것이 이런 종류의 구조물을 사용하는 매우 유효한 방법이라고 생각하지만, 물론 경고가 필요하지 않습니다.

cafe의 common.c/common.h 솔루션 제안은 이러한 경고를 회피할 수 있지만 대신 사용자가 원하지 않을 수 있는 함수의 각 인스턴스에 대해 함수 호출을 생성합니다.

언급URL : https://stackoverflow.com/questions/2845748/function-defined-but-not-used-warning-in-c

반응형