31

我遇到了下面显示的代码行。

我认为这可能是对返回 void 并采用 void 指针的函数指针的强制转换。那是对的吗?

(void (*)(void *))SGENT_1_calc
4

3 回答 3

41

是的,这是正确的。我发现这不是很可读,所以我建议声明要指向的函数的签名:

 typedef void sigrout_t(void*);

我也有以类型结尾的编码约定rout_t是函数签名的类型。您可能会以其他方式命名它,因为它是POSIX保留_t后缀。

后来我正在铸造,也许可以称之为

 ((sigrout_t*) SGENT_1_calc) (someptr);
于 2013-04-04T09:28:51.363 回答
8

是的。该功能应该是这样的

void func(void*);

但是该语句缺少目标,因为强制转换为空是无用的。所以它应该像

func = (void (*)(void *))SGENT_1_calc;
于 2013-04-04T09:29:35.710 回答
-1

是的,这是一个函数指针转换。

函数指针转换

为了帮助您将函数转换为指针,您可以为函数指针类型定义别名,如下所示:

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) {
//...

这允许存储数据和函数,以便以后一起使用它们来解码数据。

于 2020-03-11T13:46:22.970 回答