함수에 대한 포인터는 void * 포인터에 저장할 수 없으므로 일반 데이터 포인터가 아닙니다. 그럼에도 불구하고 아래 코드와 같이 함수 포인터의 사본을 동적 메모리 (gcc 및 clang)에 저장할 수있는 것 같습니다. 이러한 코드는 C ++ 표준에 따라 합법적입니까, 아니면 일종의 컴파일러 확장입니까?
또한 함수 포인터에 대한 결과 포인터는 일반 데이터 포인터처럼 작동합니다. void *에 저장하고 static_cast에 의해 void *에서 검색 할 수 있습니다. 이 행동은 표준에 의해 보장됩니까?
int main()
{
extern void fcn();
void (*fcnPtr)() = &fcn;
void (**ptrToFcnPtr)() = nullptr;
//Make the copy of fcnPtr on the heap:
ptrToFcnPtr = new decltype(fcnPtr)(fcnPtr);
//Call the pointed-to function :
(**ptrToFcnPtr)();
//Save the pointer in void* :
void *ptr = ptrToFcnPtr;
//retrieve the original ptr:
auto myPtr = static_cast< void(**)() > (ptr) ;
//free memory:
delete ptrToFcnPtr ;
}
답변
함수 포인터는 객체 포인터가 아니지만 “일부 유형의 함수에 대한 포인터”는 여전히 객체 유형 [basic.types] / 8 입니다. 따라서 함수 포인터는 그 자체가 객체이며 그들이 가리키는 것은 아닙니다.
따라서 새로운 표현식을 통해 함수 포인터 유형의 객체를 만들 수 있습니다.
답변
그것들은 (함수 포인터) void * 포인터에 저장할 수 없기 때문에.
실제로 함수 포인터를 a로 저장하는 void*
것은 조건부로 지원됩니다. 이는 언어 구현에 따라 저장 될 수 있거나 저장 될 수 없음을 의미합니다. 언어 구현이 동적로드를 지원하는 경우 함수 포인터 변환 void*
이 지원 될 수 있습니다. GCC, Clang 및 MSVC는 모두 다음을 지원합니다.
reinterpret_cast<void*>(&function);
함수에 대한 포인터를 새로 할당하는 것이 합법적입니까?
확실한. 함수 포인터를 포함한 모든 포인터는 객체이며 모든 객체는 동적으로 할당 될 수 있습니다.
또한 함수 포인터에 대한 결과 포인터는 일반 데이터 포인터로 작동합니다.
함수 포인터는 객체입니다. 함수 포인터뿐만 아니라 “로 동작”의 포인터,하지만 입니다 객체에 대한 포인터.
void *에 저장하고 static_cast에 의해 void *에서 검색 할 수 있습니다. 이 행동은 표준에 의해 보장됩니까?
void에 대한 포인터와 객체에 대한 포인터 사이의 변환은 허용됩니다. 그리고 왕복 변환은 원래 포인터를 생성하도록 보장됩니다.