함수 포인터에 캐스트
아래와 같은 코드 라인을 발견했습니다.
void를 반환하고 void 포인터를 취하는 함수 포인터에 캐스트하는 것일 수도 있다고 생각합니다.그것이 맞습니까?
(void (*)(void *))SGENT_1_calc
네, 맞습니다.저는 그것이 그다지 가독성이 없다고 생각하기 때문에 가리키는 함수의 서명을 선언하는 것을 제안합니다.
typedef void sigrout_t(void*);
나는 또한 로 끝나는 코딩 규칙을 가지고 있습니다.rout_t함수 서명에 대한 그러한 유형입니다.다른 이름으로 지어도 좋습니다._t는 POSIX에서 예약한 접미사입니다.
나중에 캐스팅을 하게 되는데, 아마 이렇게 부를 수 있을 겁니다.
((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
'programing' 카테고리의 다른 글
| Angular CLI 버전을 다운그레이드하는 방법은? (0) | 2023.10.10 |
|---|---|
| Mysqlint(11) 번호가 범위를 벗어남 (0) | 2023.10.10 |
| 특정 날짜가 있는 레코드를 선택하는 MySql 쿼리 (0) | 2023.10.05 |
| Scala Spark에서 csv 파일을 데이터 프레임으로 읽는 동안 스키마 제공 (0) | 2023.10.05 |
| 우커머스: 쿠폰 적용/제거 시 에이잭스를 비활성화하는 방법? (0) | 2023.10.05 |