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

일부 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;
}

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



답변

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


답변

프로토 타입에 사용되지 않는 매개 변수가있는 이유 는 일반적으로 함수가 일부 외부 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)캐스트가 들어오는 곳입니다. 그것은 컴파일러에게 명령문이 전혀 효과가 없다는 것을 명확하고 명시 적으로 알려줄 것입니다.


답변