programing

함수 포인터에 캐스트

elecom 2023. 10. 5. 21:13
반응형

함수 포인터에 캐스트

아래와 같은 코드 라인을 발견했습니다.

void를 반환하고 void 포인터를 취하는 함수 포인터에 캐스트하는 것일 수도 있다고 생각합니다.그것이 맞습니까?

(void (*)(void *))SGENT_1_calc

네, 맞습니다.저는 그것이 그다지 가독성이 없다고 생각하기 때문에 가리키는 함수의 서명을 선언하는 것을 제안합니다.

 typedef void sigrout_t(void*);

나는 또한 로 끝나는 코딩 규칙을 가지고 있습니다.rout_t함수 서명에 대한 그러한 유형입니다.다른 이름으로 지어도 좋습니다._tPOSIX에서 예약한 접미사입니다.

나중에 캐스팅을 하게 되는데, 아마 이렇게 부를 수 있을 겁니다.

 ((sigrout_t*) SGENT_1_calc) (someptr);

네.기능은 이렇게 보여야 합니다.

void func(void*);

그러나 무(無) 캐스팅은 쓸모가 없기 때문에 목표를 놓치고 있습니다.그러니까 지금은.

func = (void (*)(void *))SGENT_1_calc;

기존의 어떤 답도 직접적인 사용법, 즉 함수를 호출하기 위해 함수 포인터를 가져와서 캐스팅하는 것을 보여주지 않습니다.익명 포인터를 통해 함수와 데이터 모두에 접근하면서 json으로 객체의 내용을 보여주기 위해 이 게임을 하고 있었습니다.

#include <stdio.h>
#include <stdlib.h>

typedef struct box1_s{
    int a;
    char b[50];
}box1_t;

void box1_t_print(void* ptr){
    box1_t* box = (box1_t*)ptr;
    printf("{\"a\": %i, \"b\": \"%s\"}", box->a, box->b);
}

int main(){
    void* print = (void*)box1_t_print;
    box1_t mybox = {3, "Hi folks, it's me!"};
    void* ptr = &mybox;
    printf("mybox = ");
    ((void (*)(void*))print)(ptr);
    return 0;
}

프로그램의 출력:

마이박스 = {"a": 3, "b": "안녕하세요, 저예요!"}

네, 함수 포인터 캐스트입니다.

함수 포인터 캐스트

포인터에 함수를 캐스팅하는 데 도움이 되도록 다음과 같이 함수 포인터 유형에 대한 별칭을 정의할 수 있습니다.

typedef void void_to_void_fct(void*);

값을 가져오고 반환하는 함수의 유형을 정의할 수도 있습니다.

typedef int math_operator(int, int);

나중에 다음과 같은 함수 포인터 유형에 함수를 저장할 수 있습니다.

void mystery(void* arg) {
    // do something nasty with the given argument
};

int add(int a, int b) {
    return a + b;
}

void_to_void  *ptr1 = mystery;
math_operator *ptr2 = add;

가끔, 당신은 다음과 같은 기능을 가지고 있습니다.print_str:

void print_str(char* str) {
    printf("%s", str);
}

인수 유형과 무관한 함수 포인터에 저장하려고 합니다.그러면 다음과 같은 깁스를 사용할 수 있습니다.

(void (*)(void *))print_str

아니면

(void_to_void_fct*)print_str

함수 포인터를 사용하는 이유는 무엇입니까?

함수 포인터를 사용하면 변수 내부에 "함수를 저장"할 수 있습니다(실제로 함수의 주소를 저장합니다).사용자 입력에 따라 일부 코드가 다른 동작을 하도록 허용하고자 할 때 매우 편리합니다.

예를 들어, 데이터와 이를 해독하는 방법이 있다고 가정해 보겠습니다.우리는 이 정보를 유지하기 위해 다음과 같은 구조를 가질 수 있습니다.

typedef char* decoder_type(char*);
struct encoded_data {
    char*           data;
    decoder_type    *decoder_fct;
};

char* decoding_function_1(char* data) {
//...

char* decoding_function_2(char* data) {
//...

이를 통해 데이터와 함수를 모두 저장하여 나중에 함께 사용하여 데이터를 디코딩할 수 있습니다.

언급URL : https://stackoverflow.com/questions/15807333/cast-to-function-pointer

반응형