[c] C에서 “사용하지 않은 매개 변수”경고를 표시하지 않는 방법은 무엇입니까?

예를 들어 :

Bool NullFunc(const struct timespec *when, const char *who)
{
   return TRUE;
}

C ++ /*...*/에서 매개 변수 에 대한 의견 을 넣을 수있었습니다 . 그러나 물론 C에서는 오류가 발생 error: parameter name omitted합니다.



답변

나는 보통 다음과 같은 매크로를 작성합니다.

#define UNUSED(x) (void)(x)

사용하지 않는 모든 매개 변수에이 매크로를 사용할 수 있습니다. (이것은 모든 컴파일러에서 작동합니다.)

예를 들면 다음과 같습니다.

void f(int x) {
    UNUSED(x);
    ...
}


답변

gcc에서는 unused속성으로 매개 변수에 레이블을 지정할 수 있습니다 .

변수에 첨부 된이 속성은 변수를 사용하지 않을 수 있음을 의미합니다 . GCC는이 변수에 대해 경고를 생성하지 않습니다.

실제로 이것은 __attribute__ ((unused))매개 변수 바로 앞에 두어 수행됩니다 . 예를 들면 다음과 같습니다.

void foo(workerid_t workerId) { }

된다

void foo(__attribute__((unused)) workerid_t workerId) { }


답변

gcc / clang의 사용하지 않는 속성을 사용할 수 있지만 헤더에 이러한 매크로를 사용하여 소스 전체에 gcc 관련 속성을 사용하지 않으며 모든 __attribute__곳에서 약간의 장황한 / 추악한 사용을 피할 수 있습니다.

#ifdef __GNUC__
#  define UNUSED(x) UNUSED_ ## x __attribute__((__unused__))
#else
#  define UNUSED(x) UNUSED_ ## x
#endif

#ifdef __GNUC__
#  define UNUSED_FUNCTION(x) __attribute__((__unused__)) UNUSED_ ## x
#else
#  define UNUSED_FUNCTION(x) UNUSED_ ## x
#endif

그럼 당신은 할 수 …

void foo(int UNUSED(bar)) { ... }

bar코드 어디에서나 사용하려고하면 오류가 발생 하여 실수로 속성을 남길 수 없기 때문에 이것을 선호합니다 .

그리고 기능을 위해 …

static void UNUSED_FUNCTION(foo)(int bar) { ... }

참고 1) :
내가 아는 한 MSVC는에 해당하지 않습니다 __attribute__((__unused__)).

주 2) : 매크로, 괄호를 포함하는 인수하지 작동 이 같은 인수가 있다면 그래서 당신이 할 수 할, 또는 받는 사람, 이것은 유일한 단점입니다 매크로 내가 지금까지 발견이 경우에 나는 후퇴 에
UNUSED
float (*coords)[3]
float UNUSED((*coords)[3])float (*UNUSED(coords))[3]UNUSED(void)coords;


답변

사용하지 않는 속성을 가진 gcc를 사용하는 경우 :

int foo (__attribute__((unused)) int bar) {
    return 0;
}


답변

이것이 gcc로 표시되어 있으면 명령 행 스위치를 사용할 수 있습니다 Wno-unused-parameter.

예를 들면 다음과 같습니다.

gcc -Wno-unused-parameter test.c

물론 이것은 전체 파일에 영향을 미치며 스위치를 설정 한 위치에 따라 프로젝트에 영향을 주지만 코드를 변경할 필요는 없습니다.


답변

소스 코드 블록에 대해 사용되지 않은 매개 변수 경고를 억제하는 gcc / g ++ 고유의 방법은 다음 pragma 명령문으로이를 묶는 것입니다.

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-parameter"
<code with unused parameters here>
#pragma GCC diagnostic pop


답변

속성에 레이블을 지정하는 것이 이상적입니다. 매크로는 언젠가 혼란을 초래합니다. void (x)를 사용하여 처리 중에 오버 헤드를 추가하고 있습니다.

입력 인수를 사용하지 않는 경우

void foo(int __attribute__((unused))key)
{
}

함수 내에 정의 된 변수를 사용하지 않는 경우

void foo(int key)
{
   int hash = 0;
   int bkt __attribute__((unused)) = 0;

   api_call(x, hash, bkt);
}

이제 나중에 논리에 해시 변수를 사용하지만 bkt는 필요하지 않습니다. bkt를 사용하지 않는 것으로 정의하십시오. 그렇지 않으면 컴파일러에서 “bkt set bt not used”라고 말합니다.

참고 : 이것은 최적화가 아닌 경고를 억제하기위한 것입니다.