사용하지 않는 함수 매개 변수 값을 void로 캐스팅하는 이유는 무엇입니까?


98

일부 C 프로젝트에서 다음 코드를 보았습니다.

static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
    (void)ud;
    (void)osize;
    /* some code not using `ud` or `osize` */
    return ptr;
}

무효화하는 두 개의 캐스트가 어떤 용도로 사용됩니까?


정답 (사용되지 않는 매개 변수에 대한 컴파일러 경고 금지)은 Charles의 링크 된 질문에 있으므로 닫기 투표입니다.
TED

@Cody Gray-그 이유로 폐쇄되었습니다. 그러나 실제로는 그 질문의 중복이 아닙니다. 689677은 매개 변수가 아닌 void로 반환을 캐스팅하는 것에 대해 이야기하고있었습니다.
TED

19
실제로 두 중복은이 질문에 유효하지 않습니다. 하나는 C ++이고 다른 하나는 반환 값에 관한 것입니다. 이것들은 같은 것이 아닙니다 . C 매개 변수 중복이 있습니까?
Matt Joiner 2011 년

2
이것은 제안 된 중복 항목이 다룬 것과는 다른 질문입니다. 그래도 왜 실수했는지 알 수 있습니다. (분명히) 다시 열었습니다.
Tim Post

4
주의 : C ++가 (void)약간 다른 효과를 사용하므로이 질문을 C ++ 질문의 중복으로 닫지 마십시오 . 이 질문은 C에 관한 것입니다
안티 Haapala

답변:


89

일부 매개 변수가 사용되지 않기 때문에 컴파일러의 경고를 피할 수 있습니다.


3
어떻게하면 경고를 억제하는 가장 좋은 방법입니다 : stackoverflow.com/questions/3417837/...
치로 틸리郝海东冠状病六四事件法轮功

@Benoit 무효로 캐스팅하면 실제로 무엇을합니까? 의도적으로 무언가를 무시하고 있거나 실제로 무언가를 수행 (무효)하고 컴파일러가이를 발견하면 변수로 무언가를 수행 한 것으로 간주하여 경고를 발행하지 않음을 컴파일러에게 보여주는 유일한 기능입니까?
탄 왕

2
@TanWang 그것의 유일한 기능은 당신이 의도적으로 무언가를 무시하고 있다는 것을 컴파일러에게 보여주는 것입니다. 런타임에는 아무 작업도 수행하지 않습니다.
zwol 2016 년

14

프로토 타입에 사용되지 않는 매개 변수가있는 이유 는 일반적으로 함수가 일부 외부 API를 준수해야하기 때문입니다. 아마도 라이브러리 함수이거나 해당 함수에 대한 포인터가이 호출 규칙을 예상하는 다른 함수로 전달됩니다. 그러나 호출 규칙에서 사용하는 모든 인수가 실제로 함수 자체에 필요한 것은 아닙니다.

언급 하는 이유본문에 매개 변수 이름 하는 과 같은 경고를 피하기 위해서입니다.

unused.c: In function l_alloc’:
unused.c:3:22: warning: unused parameter ud [-Wunused-parameter]
 void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
                      ^~

이 경고 는 함수 본문의 실제 매개 변수를 사용하여 억제 할 수 있습니다. 예를 들어 다음 문이있는 경우 :

ud;

이 경고는 이제 표시되지 않습니다. 그러나 이제 GCC는 또 다른 경고 .

unused.c:5:5: warning: statement with no effect [-Wunused-value]
     ud;
     ^~

경고는ud; 구문이 유효한 C이지만 구문에 전혀 영향을 미치지 않으며 명령문과 다르지 않은 실수 일 수 있음을 .

abort;

아마도 다음과 같이 작성되었을 것입니다. abort(); 무언가를하기 위해 대신 것입니다.

그리고 그것이 (void)캐스트가 들어오는 곳입니다. 그것은 컴파일러에게 명령문이 전혀 효과가 없다는 것을 명확하고 명시 적으로 알려줄 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.