일반적으로 이것은 컴파일러에 의해 포착됩니다. 그러나 함수 포인터에 대한 캐스트를 사용하면이를 수행 할 수 있습니다.
내가 제대로 말하지 않았을 수 있습니다. 여기 내 질문을 더 잘 설명하는 예가 있습니다.
void printintp(int *ip)
{
printf("pointer = %p\n", ip);
printf("*pointer = %d\n", *ip);
}
void printint(int &i)
{
printf("int = %d\n", i);
}
int main()
{
int a = 555;
//int &irp = &a; // ERROR 1
void (*f)(void *);
//printint((int &) &a); // ERROR 2
f = (void (*)(void *))printintp;
f(&a);
f = (void (*)(void *))printint;
//printint(&a); // ERROR 3 (invalid conversion of `int *` to `int`)
f(&a); // GOOD (why?)
return 0;
}
그리고 출력은 당연히 예상되는 것입니다.
pointer = 0x7ffd01995bf4
*pointer = 555
int = 555
그래서 내 질문은 이것으로 구체화됩니다. 왜 &a
객체 기대 함수에 포인터 를 전달하는 것이 printint
괜찮습니까? 내 구현에서 작동하는 정의되지 않은 동작입니까? 그렇지 않은 경우 주소를 전달하면 매개 변수 int &i
가 객체에 어떻게 바인딩되고 a
내가 표시 한 것을 거부하는 이유는 무엇 ERROR 2
입니까?
PS : 나는이 문제에 대해 찾을 수있는 최선은 이 둘을 주장하는 printintp
그리고 printint
실제로, 함수 호출이 다른 (수 있습니다,하지만, "기능적으로 동일"입니다 printintp(&a)
과 printint(a)
).
내 구현에서 작동하는 정의되지 않은 동작입니까?
예. 대부분의 컴파일러는 내부적으로 포인터를 사용하여 참조를 구현하지만 표준에 의해 지시되지는 않습니다.
표준 구문에서는 포인터를있는 그대로 참조에 할당 할 수 없으며 그 반대의 경우도 마찬가지이므로 해당 명령문에서 컴파일러 오류가 발생합니다.
모든 것을에 캐스팅 void*
하면 모든 베팅이 유형 안전에 대해 해제됩니다. 사용하여 C 스타일의 유형 캐스트를 , 당신은 단지에 대해 아무것도 멀리 얻을 수 있습니다. 당신은 기본적으로 당신이하고있는 일을 알고 있다는 것을 컴파일러에게 말하고 있기 때문에 그것을 받아들이고 조용해야합니다. 이 때 같은 유형 캐스트가 위험 할 수 있습니다 이유입니다 하지 않습니다 당신이 정말로 무엇을하고 있는지 알고 절대적으로 필요한 경우가 아니면 피해야한다. 당신이 캐스팅해야하는 경우, C ++를 선호 - 스타일 타입 캐스트를 대신 ( static_cast
, reinterpret_cast
, 등). 적어도 형식 안전성을 포기하지는 않을 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다