서로 다른 유형의 매개 변수를 사용하는 서로 다른 함수에 대한 포인터 쌍이 호환 될 수 있습니까?

xiver77

특정 서명의 함수 주소를 다른 서명을 가지도록 정의 된 함수 포인터에 넣고 원활하게 사용할 수 있습니까?

예를 들어, 다음 코드

#include <stdio.h>

void print_n(int *pn) {
    printf("%d\n", *pn);
}

void print_n_wrapper(void *p) {
    print_n(p);
}

int main(void) {
    int n = 123;
    void (*f)(void *) = print_n_wrapper;
    f(&n);
    f = print_n;
    f(&n);
    return 0;
}

내 컴퓨터에서 컴파일되고 잘 실행됩니다. 어떻게 든 정의되지 않은 동작을 호출하고 있습니까?

Sourav Ghosh

예, 정의되지 않은 동작 입니다.

인용 C11, 장 §6.3.2.3, 포인터 , ( 내 강조 )

한 유형의 함수에 대한 포인터는 다른 유형의 함수에 대한 포인터로 변환되고 다시 역으로 변환 될 수 있습니다. 결과는 원래 포인터와 동일하게 비교됩니다. 변환 된 포인터를 사용하여 형식이 참조 된 형식과 호환되지 않는 함수를 호출하면 동작이 정의되지 않습니다.

"형식이 호환되지 않는 함수"부분에 대해서는 호환성의 정의는 다음과 같습니다.

두 함수 유형이 호환 되려면 둘 다 호환 가능한 반환 유형을 지정해야합니다. (146) 또한, 매개 변수 유형 목록이 둘 다 존재하는 경우 매개 변수의 수와 생략 부호 종결자를 사용하는 데 동의해야합니다. 해당 매개 변수는 호환 가능한 유형을 가져야합니다.

즉, void *int * 했어야 같은 종류의,하지만 그들은 되지 않습니다 . 따라서 함수도 호환되는 유형이 아닙니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관