Typedef 함수 포인터?
DLL을 동적으로로드하는 방법을 배우고 있지만 이해하지 못하는 것은이 줄입니다.
typedef void (*FunctionFunc)();
몇 가지 질문이 있습니다. 누군가 대답 할 수 있다면 감사 할 것입니다.
- 왜
typedef
사용됩니까? - 구문이 이상하게 보입니다. 나중에
void
함수 이름이나 무언가가 없어야합니까? 익명 함수처럼 보입니다. - 함수의 메모리 주소를 저장하기 위해 함수 포인터가 생성 되었습니까?
그래서 지금 당황합니다. 나를 위해 무엇을 명확히 할 수 있습니까?
typedef
이름을 형식에 연결하는 언어 구문입니다.
예를 들어 원래 유형과 같은 방식으로 사용합니다.
typedef int myinteger;
typedef char *mystring;
typedef void (*myfunc)();
그들을 사용하여
myinteger i; // is equivalent to int i;
mystring s; // is the same as char *s;
myfunc f; // compile equally as void (*f)();
보시다시피, typedefed 이름을 위에 주어진 정의로 바꿀 수 있습니다 .
어려움은 C와 C ++에서 함수 구문과 가독성에 대한 포인터에 typedef
있으며 그러한 선언의 가독성을 향상시킬 수 있습니다. 그러나 다른 간단한 유형과 달리 함수는 반환 값과 매개 변수를 가질 수 있으므로 함수에 대한 포인터를 길고 복잡하게 선언 할 수 있으므로 구문이 적합합니다.
가독성은 함수 배열에 대한 포인터와 다른 간접적 인 특징으로 인해 까다로워지기 시작할 수 있습니다.
세 가지 질문에 대답하려면
typedef가 사용되는 이유는 무엇입니까? 코드를 쉽게 읽을 수 있도록-특히 함수 또는 구조 이름에 대한 포인터.
구문이 이상하게 보입니다 (함수 선언에 대한 포인터에서) . 적어도 시작할 때 구문을 읽을 수 없습니다. 사용하여
typedef
선언 대신 읽기를 완화함수의 메모리 주소를 저장하기 위해 함수 포인터가 생성 되었습니까? 예, 함수 포인터는 함수의 주소를 저장합니다. 이것은
typedef
프로그램의 쓰기 / 읽기를 쉽게하는 구성 과는 아무런 관련이 없습니다 . 컴파일러는 실제 코드를 컴파일하기 전에 typedef 정의를 확장합니다.
예:
typedef int (*t_somefunc)(int,int);
int product(int u, int v) {
return u*v;
}
t_somefunc afunc = &product;
...
int x2 = (*afunc)(123, 456); // call product() to calculate 123*456
typedef
별명을 지정하는 데 사용됩니다. 이 경우 앨리어싱하고 있습니다FunctionFunc
로void(*)()
.실제로 구문이 이상하게 보이면 다음을 살펴보십시오.
typedef void (*FunctionFunc) ( ); // ^ ^ ^ // return type type name arguments
아니요, 이것은 단순히 컴파일러에게
FunctionFunc
유형이 함수 포인터가 될 것이라고 알려주고 다음 과 같이 정의 하지 않습니다 .FunctionFunc x; void doSomething() { printf("Hello there\n"); } x = &doSomething; x(); //prints "Hello there"
typedef
단어가 없으면 C ++에서 선언은 FunctionFunc
인수가없는 함수에 대한 포인터 유형 의 변수 를 선언하여을 반환 void
합니다.
typedef
대신 그것을 사용하여 FunctionFunc
해당 유형의 이름으로 정의하십시오 .
C ++ 11을 사용할 수 있으면 std::function
및 using
키워드 를 사용할 수 있습니다 .
using FunctionFunc = std::function<void(int arg1, std::string arg2)>;
#include <stdio.h>
#include <math.h>
/*
To define a new type name with typedef, follow these steps:
1. Write the statement as if a variable of the desired type were being declared.
2. Where the name of the declared variable would normally appear, substitute the new type name.
3. In front of everything, place the keyword typedef.
*/
// typedef a primitive data type
typedef double distance;
// typedef struct
typedef struct{
int x;
int y;
} point;
//typedef an array
typedef point points[100];
points ps = {0}; // ps is an array of 100 point
// typedef a function
typedef distance (*distanceFun_p)(point,point) ; // TYPE_DEF distanceFun_p TO BE int (*distanceFun_p)(point,point)
// prototype a function
distance findDistance(point, point);
int main(int argc, char const *argv[])
{
// delcare a function pointer
distanceFun_p func_p;
// initialize the function pointer with a function address
func_p = findDistance;
// initialize two point variables
point p1 = {0,0} , p2 = {1,1};
// call the function through the pointer
distance d = func_p(p1,p2);
printf("the distance is %f\n", d );
return 0;
}
distance findDistance(point p1, point p2)
{
distance xdiff = p1.x - p2.x;
distance ydiff = p1.y - p2.y;
return sqrt( (xdiff * xdiff) + (ydiff * ydiff) );
}
일반적인 구문 의 경우 ANSI C 표준의 부록 A를 볼 수 있습니다 .
거기에서 배 커스 - 나 우어 형식에서, 당신은이 볼 수있는 typedef
유형이있다 storage-class-specifier
.
유형에서 declaration-specifiers
당신은 당신이 문제가되지 않는다 순서있는 많은 지정 유형을 혼합 할 수 있음을 알 수있다.
예를 들어,
long typedef long a;
에 a
대한 별칭으로 유형을 정의합니다 long long
. 따라서 철저한 사용에 대한 typedef를 이해하려면 구문을 정의하는 backus-naur 형식을 참조해야합니다 (ISO뿐만 아니라 ANSI C에 대한 올바른 문법이 많이 있습니다).
typedef를 사용하여 함수 유형의 별명을 정의 할 때 함수의 ID를 넣는 동일한 위치에 별명을 넣어야합니다. 귀하의 경우 FunctionFunc
호출시 유형 검사가 비활성화되고 아무것도 반환하지 않는 함수에 대한 포인터의 별칭으로 유형을 정의하십시오 .
참고 URL : https://stackoverflow.com/questions/4295432/typedef-function-pointer
'Programming' 카테고리의 다른 글
Java에서 SuppressWarnings ( "체크되지 않은") 란 무엇입니까? (0) | 2020.02.19 |
---|---|
Series에서 DataFrame으로 Pandas GroupBy 출력 변환 (0) | 2020.02.19 |
WCF 서비스의 REST / SOAP 엔드 포인트 (0) | 2020.02.19 |
Chrome 개발자 도구에서로드 된 모든 스크립트를 검색하는 방법 (0) | 2020.02.19 |
파이썬에서 문자열을 정수로 변환하는 방법은 무엇입니까? (0) | 2020.02.19 |