형식 정의 함수 포인터?
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)();
보다시피, 위에 주어진 정의로 타이핑된 이름을 바꾸면 된다.
난이도는 C와 C++의 함수 구문 및 가독성에 대한 포인터와typedef
그러한 선언의 가독성을 향상시킬 수 있다.그러나 다른 단순한 형식과는 달리 함수는 반환 값과 매개변수를 가질 수 있으므로, 구문이 적절하며, 따라서 때로는 길고 복잡한 포인터 선언이 기능한다.
판독성은 기능 배열과 그 밖의 다른 간접 맛에 대한 포인터를 사용하면 정말 까다로워지기 시작할 수 있다.
세 가지 질문에 답하기 위해
typetef를 선택하십시오.코드 판독을 용이하게 하기 위해 - 특히 기능 또는 구조물 이름에 대한 포인터의 경우.
구문이 홀수(기능 선언에 대한 포인터)로 표시됨그 구문은 적어도 시작할 때 읽기에 분명하지 않다.사용
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를 참조할 수 있다.
거기서 백커스나우르스(Backus-Naur) 형태로 보면 알 수 있다.typedef
그런 타입이 있다.storage-class-specifier
.
유형에서declaration-specifiers
당신은 당신이 많은 종류의 지정자를 혼합할 수 있다는 것을 볼 수 있고, 순서는 중요하지 않다.
예를 들어, 이렇게 말하는 것이 옳다.
long typedef long a;
유형을 정의하다a
의 가명으로long long
따라서, 철저한 사용에 대한 서식을 이해하려면 구문을 정의하는 backus-naur 형식을 참조할 필요가 있다(ISO뿐만 아니라 ANSI C에 대한 올바른 문법도 많이 있다).
typef를 사용하여 함수 유형의 별칭을 정의할 때는 함수의 식별자를 배치한 동일한 위치에 별칭을 배치해야 한다.사용자의 경우 유형을 정의하십시오.FunctionFunc
호출 시 유형 확인이 비활성화되고 아무것도 반환하지 않는 포인터의 별칭으로 사용됨.
참조URL: https://stackoverflow.com/questions/4295432/typedef-function-pointer
'IT이야기' 카테고리의 다른 글
WebStorm에서 Vue.js 2 디버깅 (0) | 2022.05.23 |
---|---|
Vuex & Storybook:정의되지 않음, null 또는 원시 값에서 대응적 속성을 설정할 수 없음: 정의되지 않음 (0) | 2022.05.23 |
Vue: Observer 개체로 자동 채워지는 빈 어레이 (0) | 2022.05.23 |
Vuejs - 작업에서 데이터 반환 (0) | 2022.05.23 |
Nuxt.js 저장소에서 localStorage를 사용하는 방법 (0) | 2022.05.23 |