使用存储在 C 结构中的函数数组中的函数
Using a function from a function array stored in a struct in C
我声明了这样一个结构:
typedef struct s_data {
char buff[2048];
int len;
void *func[10];
struct data *next;
} t_data;
在我的代码中,当传递一个 *data 时,我分配了一些函数(只给出一个这样更容易理解)
void init_data(t_data *data)
{
data->len = 0;
data->func[0] = &myfirstfunctions;
//doing the same for 9 others
}
我的第一个函数是将 *data 和 int 作为参数。
然后,我尝试在另一个函数中使用这个函数,doing
data->func[0](data, var);
我尝试了这个和其他一些涉及尝试寻址 (*func[0]) 的语法,但其中 none 有效。我从那里的其他更复杂的问题中了解到我不应该像这样存储我的函数,或者应该将它转换为另一个 typedef,但我并没有真正理解所有内容,因为我是编程新手。
如果您的所有函数都具有相同的签名,您可以这样做:
#include <stdio.h>
typedef void (*func)(void *, int);
struct s_data {
char buff[2048];
int len;
func f[10];
struct s_data *next;
};
static void
my_first_function(void *d, int x)
{
(void)d;
printf("%d\n", x + 2);
}
static void
init_data(struct s_data *data)
{
data->len = 1;
data->f[0] = my_first_function;
}
int
main(void)
{
struct s_data d;
init_data(&d);
d.f[0](NULL, 5);
return 0;
}
如果您的函数有不同的签名,您可能想要使用联合,或者您可能需要结构的几个不同成员来存储函数指针。
void*
只能可靠地用作通用 object 指针(“指向变量的指针”)。不是通用函数指针。
但是您可以安全地在不同的函数指针类型之间进行转换,只要您只调用具有正确类型的实际函数。所以可以只使用任何函数指针类型作为通用类型,如下所示:
void (*func[10])(void);
...
func[0] = ((void)(*)(void))&myfirstfunction;
...
((whatever)func[0]) (arguments); // call the function
您可能会注意到,C 中的函数指针语法很糟糕。所以我建议使用 typedefs:
typedef void genfunc_t (void);
typedef int somefunc_t (whatever*); // assuming this is the type of myfirstfunction
然后代码变得更容易阅读和编写:
genfunc_t* func [10];
...
func[0] = (genfunc_t*)&myfirstfunction;
...
((somefunc_t*)func[0]) (arguments);
问题是您实际上没有声明函数指针数组。你实际上做的是一个指向 void 的指针数组。
声明函数指针的语法如下:
function_return_type (*pointer_name)(arg1_type,arg2_type,...);
然后你可以创建一个函数指针数组:
function_return_type (*arr_name[])(arg1_type, arg2_type,...)
因此,您的结构声明应如下所示:
typedef void (*pointer_to_function)(void *, int);
struct s_data {
char buff[2048];
int len;
pointer_to_function array_of_pointeters[10];
struct s_data *next;
};
祝你好运:)
我声明了这样一个结构:
typedef struct s_data {
char buff[2048];
int len;
void *func[10];
struct data *next;
} t_data;
在我的代码中,当传递一个 *data 时,我分配了一些函数(只给出一个这样更容易理解)
void init_data(t_data *data)
{
data->len = 0;
data->func[0] = &myfirstfunctions;
//doing the same for 9 others
}
我的第一个函数是将 *data 和 int 作为参数。 然后,我尝试在另一个函数中使用这个函数,doing
data->func[0](data, var);
我尝试了这个和其他一些涉及尝试寻址 (*func[0]) 的语法,但其中 none 有效。我从那里的其他更复杂的问题中了解到我不应该像这样存储我的函数,或者应该将它转换为另一个 typedef,但我并没有真正理解所有内容,因为我是编程新手。
如果您的所有函数都具有相同的签名,您可以这样做:
#include <stdio.h>
typedef void (*func)(void *, int);
struct s_data {
char buff[2048];
int len;
func f[10];
struct s_data *next;
};
static void
my_first_function(void *d, int x)
{
(void)d;
printf("%d\n", x + 2);
}
static void
init_data(struct s_data *data)
{
data->len = 1;
data->f[0] = my_first_function;
}
int
main(void)
{
struct s_data d;
init_data(&d);
d.f[0](NULL, 5);
return 0;
}
如果您的函数有不同的签名,您可能想要使用联合,或者您可能需要结构的几个不同成员来存储函数指针。
void*
只能可靠地用作通用 object 指针(“指向变量的指针”)。不是通用函数指针。
但是您可以安全地在不同的函数指针类型之间进行转换,只要您只调用具有正确类型的实际函数。所以可以只使用任何函数指针类型作为通用类型,如下所示:
void (*func[10])(void);
...
func[0] = ((void)(*)(void))&myfirstfunction;
...
((whatever)func[0]) (arguments); // call the function
您可能会注意到,C 中的函数指针语法很糟糕。所以我建议使用 typedefs:
typedef void genfunc_t (void);
typedef int somefunc_t (whatever*); // assuming this is the type of myfirstfunction
然后代码变得更容易阅读和编写:
genfunc_t* func [10];
...
func[0] = (genfunc_t*)&myfirstfunction;
...
((somefunc_t*)func[0]) (arguments);
问题是您实际上没有声明函数指针数组。你实际上做的是一个指向 void 的指针数组。
声明函数指针的语法如下:
function_return_type (*pointer_name)(arg1_type,arg2_type,...);
然后你可以创建一个函数指针数组:
function_return_type (*arr_name[])(arg1_type, arg2_type,...)
因此,您的结构声明应如下所示:
typedef void (*pointer_to_function)(void *, int);
struct s_data {
char buff[2048];
int len;
pointer_to_function array_of_pointeters[10];
struct s_data *next;
};
祝你好运:)