遇到下面显示的代码行 我认为它可能是一个函数指针的转换,返回void并获取一个void指针,这是正确的吗?
(void (*)(void *))SGENT_1_calc
答案 0 :(得分:34)
是的,这是对的。我发现它不是很易读,所以我建议声明要指出的函数的签名:
typedef void sigrout_t(void*);
我还有编码约定,以rout_t
结尾的类型是函数签名的类型。您可以另外命名,因为_t
是Posix的后缀reserved
后者我正在施法,或许称之为
((sigrout_t*) SGENT_1_calc) (someptr);
答案 1 :(得分:5)
是的,功能应该看起来像这样
void func(void*);
但是声明错过了一个目标,因为无所作为是无用的。所以它应该像
func = (void (*)(void *))SGENT_1_calc;
答案 2 :(得分:0)
是的,这是你所说的演员。
答案 3 :(得分:0)
是的,它是一个函数指针,你可以用proto void funcname(void *)分配给一个函数 这里SGENT_1_calc可以直接分配给funcname
答案 4 :(得分:-1)
是的,这是function pointer演员表。
为帮助您将函数强制转换为指针,可以为函数指针类型定义别名,如下所示:
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) {
//...
这允许同时存储数据和函数,以便以后一起使用它们对数据进行解码。