도발하지 않고 함수에 대한 포인터가 어떻게 호출 될까요?
-
09-09-2019 - |
문제
C ++ 프로그램에서 PY ++에 의해 생성 된 이상한 typedef 문이 있습니다.
double radius(int); // function to be wrapped
typedef double (*radius_function_type)(int);
bp::def("radius", radius_function_type(&radius)); // bp::def is a function for wrapping
내가 지금까지 알아 낸 것은 위의 typedef statemnt가 유형이 아니라는 것입니다. 대부분의 사람들은 익숙하다는 것입니다.
typedef complex_type simple_alias;
오히려 그것은 int를 인수로 가져 와서 두 배를 반환하는 함수에 대한 포인터를 선언하는 방법입니다 (프로토 타입과 동일). 그래서 내 질문은 이제 기능에 대한 포인터입니다. (탈환없이) ~이다 ~라고 불리는 인수로서 기능의 주소로? 이것은 또한 프로토 타입과 일치하지 않습니다. 누군가 설명 해주세요!
해결책
귀하의 질문은 혼란 스럽습니다. 이것이 무엇을하는지 묻고 있습니까 :
radius_function_type(&radius)"
이것은 단지 C ++ typecast입니다.
radius (int (42));
그러나 반경은 이미 radius_function_type 유형이므로 쉽게 할 수 있습니다.
bp::def("radius", radius);
그러나 이것은 PY ++에 의해 생성 된 코드이므로 출력에 따라 더주의를 기울일 것입니다.
다른 팁
함수 포인터 변수를 선언하지는 않지만 함수 포인터 typedef radius_function_type
. radius_function_type(&radius)
함수 포인터 자체에 대한 (중복) 캐스트입니다. (단거리 &
연산자 주소도 중복됩니다. 함수의 경우 radius
그리고 &radius
같은 것입니다.)
낮은 레벨에서, 호출은 기본 호출 규칙 (보통 스택에)에 따라 어딘가에 인수를두고 메모리 주소로 점프하는 것입니다. 따라서 컴파일러는 기능 포인터 유형 (함수 서명)과 포인터 값 자체를 알고 있다면 포인터만으로 함수를 호출 할 수 있습니다.
글쎄 ... 배열이 포인터, C 및 C ++와 관련된 방식과 약간 비슷합니다. 함수의 이름은 기본적으로 포인터입니다. 그 관점에서 볼 때, 정의가 주어진다는 것은 놀라운 일이 아닙니다.
int foo(int a, int b)
{
return a + b;
}
기능 이름 인 포인터를 통해 직접 호출을 할 수 있습니다.
foo(1, 2);
또는 해당 값을 별도의 변수에 저장하여 포인터로 선언해야합니다.
int (*pointer)(int, int) = foo;
pointer(1, 2);
이 경우, 우리는 포인터 변수를 직접 호출 할 수 있으며, 글을 작성하여 기능의 주소를 명시 적으로 가져갈 필요가 없습니다. &foo
.
함수의 포인터를 의미하는 Dereferencing (생각하는 방식)은 데이터 메모리가 될 코드 메모리에 액세스하는 것을 의미합니다.
기능 포인터는 그런 식으로 불쾌감을 느끼지 않는다고 생각하지 않습니다. 대신, 그것은 호출됩니다.
"Call"과 함께 "Dereference"라는 이름을 나란히 사용합니다. 괜찮아.
어쨌든 : C는 기능 이름 식별자와 가변 보유 함수의 포인터가 동일 함을 의미하는 방식으로 설계되었습니다. 코드 메모리 주소. 또한 식별자 또는 변수에서 Call () 구문을 사용하여 해당 메모리로 점프 할 수 있습니다.
함수 포인터는 기본적으로 호출 해야하는 함수의 주소입니다. 함수 포인터가 가리키는 함수를 호출하려면 함수 포인터가 마치 호출하려는 함수의 이름 인 것처럼 간주합니다. 그것을 자체라고 부르는 행위는 불화를 수행합니다. 명백한 부정이 필요하지 않습니다.
기능 포인터 구문은 포인터 (& 및 *)처럼 보일 수 있거나 생략 할 수 있습니다. 처럼 @풀다 이미 베어 배열이 포인터와 비슷한 곳에서 배열이 처리되는 방식과 유사하며 선택적으로 배열을 접두사로 접두사로 접두어 주소를 얻을 수 있습니다.