특정 서명의 함수 주소를 다른 서명을 가지도록 정의 된 함수 포인터에 넣고 원활하게 사용할 수 있습니까?
예를 들어, 다음 코드
#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;
}
내 컴퓨터에서 컴파일되고 잘 실행됩니다. 어떻게 든 정의되지 않은 동작을 호출하고 있습니까?
예, 정의되지 않은 동작 입니다.
인용 C11
, 장 §6.3.2.3, 포인터 , ( 내 강조 )
한 유형의 함수에 대한 포인터는 다른 유형의 함수에 대한 포인터로 변환되고 다시 역으로 변환 될 수 있습니다. 결과는 원래 포인터와 동일하게 비교됩니다. 변환 된 포인터를 사용하여 형식이 참조 된 형식과 호환되지 않는 함수를 호출하면 동작이 정의되지 않습니다.
"형식이 호환되지 않는 함수"부분에 대해서는 호환성의 정의는 다음과 같습니다.
두 함수 유형이 호환 되려면 둘 다 호환 가능한 반환 유형을 지정해야합니다. (146) 또한, 매개 변수 유형 목록이 둘 다 존재하는 경우 매개 변수의 수와 생략 부호 종결자를 사용하는 데 동의해야합니다. 해당 매개 변수는 호환 가능한 유형을 가져야합니다.
즉, void *
및 int *
했어야 같은 종류의,하지만 그들은 되지 않습니다 . 따라서 함수도 호환되는 유형이 아닙니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다