문제

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 () 구문을 사용하여 해당 메모리로 점프 할 수 있습니다.

함수 포인터는 기본적으로 호출 해야하는 함수의 주소입니다. 함수 포인터가 가리키는 함수를 호출하려면 함수 포인터가 마치 호출하려는 함수의 이름 인 것처럼 간주합니다. 그것을 자체라고 부르는 행위는 불화를 수행합니다. 명백한 부정이 필요하지 않습니다.

기능 포인터 구문은 포인터 (& 및 *)처럼 보일 수 있거나 생략 할 수 있습니다. 처럼 @풀다 이미 베어 배열이 포인터와 비슷한 곳에서 배열이 처리되는 방식과 유사하며 선택적으로 배열을 접두사로 접두사로 접두어 주소를 얻을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top