IT이야기

형식 정의 함수 포인터?

cyworld 2022. 5. 23. 21:45
반응형

형식 정의 함수 포인터?

DLL을 동적으로 로드하는 방법을 배우고 있지만 이해가 되지 않는 것은 이 선입니다.

typedef void (*FunctionFunc)();

궁금한 것이 몇 가지 있습니다만약 누군가가 그들에게 대답할 수 있다면 나는 감사할 것이다.

  1. 왜 그럴까?typedef사용하셨습니까?
  2. 구문이 이상해 보이다; 뒤에void함수 이름 같은 것이 없어야 하는가?그것은 익명의 함수처럼 보인다.
  3. 함수의 메모리 주소를 저장하기 위해 함수 포인터가 생성되었는가?

그래서 나는 지금 혼란스럽다. 네가 나를 위해 명확하게 해줄 수 있겠니?

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
  1. typedef별칭 유형에 사용됨. 이 경우 별칭 지정FunctionFuncvoid(*)().

  2. 구문이 이상하게 보이긴 하지만, 이것 좀 봐.

    typedef   void      (*FunctionFunc)  ( );
    //         ^                ^         ^
    //     return type      type name  arguments
    
  3. 아니, 이건 컴파일러에게 단순히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

반응형