예를 들어 :
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”라고 말합니다.
참고 : 이것은 최적화가 아닌 경고를 억제하기위한 것입니다.