我有一个包含如下声明的结构:
void (*functions[256])(void) //Array of 256 functions without arguments and return value
在另一个函数中我想定义它,但是有256个函数! 我可以这样做:
struct.functions[0] = function0;
struct.functions[1] = function1;
struct.functions[2] = function2;
等等,但这太累了,我的问题是有办法做这样的事吗?
struct.functions = { function0, function1, function2, function3, ..., };
编辑:修正语法错误,如Chris Lutz所述。
答案 0 :(得分:18)
我有一个包含如下声明的结构:
不,不。这是一个语法错误。你在寻找:
void (*functions[256])();
这是一个函数指针数组。但请注意,void func()
不是“不带参数且不返回任何内容的函数”。它是一个函数,它接受未指定的数字或类型的参数,并且不返回任何内容。如果你想要“没有参数”,你需要这个:
void (*functions[256])(void);
在C ++中,void func()
意味着“不带参数”,这会导致一些混淆(特别是因为C为void func()
指定的功能具有可疑价值。)< / p>
无论哪种方式,你应该typedef
你的函数指针。这将使代码更容易理解,并且您只有一次机会(在typedef
)以获得语法错误:
typedef void (*func_type)(void);
// ...
func_type functions[256];
无论如何,您无法分配数组,但可以初始化数组并复制数据:
static func_type functions[256] = { /* initializer */ };
memcpy(struct.functions, functions, sizeof(functions));
答案 1 :(得分:4)
我遇到了同样的问题,这是我测试解决方案的小程序。它看起来非常简单,所以我想我会为未来的访客分享它。
#include <stdio.h>
int add(int a, int b) {
return a+b;
}
int minus(int a, int b) {
return a-b;
}
int multiply(int a, int b) {
return a*b;
}
typedef int (*f)(int, int); //declare typdef
f func[3] = {&add, &minus, &multiply}; //make array func of type f,
//the pointer to a function
int main() {
int i;
for (i = 0; i < 3; ++i) printf("%d\n", func[i](5, 4));
return 0;
}
答案 2 :(得分:2)
你可以动态地做...这是一个用malloc ...分配的动态函数数组的一个小例子。
#include <stdio.h>
#include <stdlib.h>
typedef void (*FOO_FUNC)(int x);
void a(int x)
{
printf("Function a: %d\n", x);
}
void b(int x)
{
printf("Function b: %d\n", x);
}
int main(int argc, char **argv)
{
FOO_FUNC *pFoo = (FOO_FUNC *)malloc(sizeof(FOO_FUNC) * 2);
pFoo[0] = &a;
pFoo[1] = &b;
pFoo[0](10);
pFoo[1](20);
return 0;
}
答案 3 :(得分:1)
从头顶而未经测试。
// create array of pointers to functions
void (*functions[256])(void) = {&function0, &function1, &function2, ..., };
// copy pointers to struct
int i;
for (i = 0; i < 256; i++) struct.functions[i] = functions[i];
编辑:修正了Chris Lutz所说的语法错误。
答案 4 :(得分:0)
您可以在声明结构实例时执行此操作:
function_structur fs = { struct_field1,
struct_field2,
{function0, function1, ..., function255},
struct_field3,
... };
在声明数组后,不能使用此快捷方式初始化数组:如果需要这样做,则必须动态执行(使用循环,memcpy
或其他内容)。< / p>
答案 5 :(得分:0)
如果你想发布 - 使用像{func1, func2, ...}
之类的表格初始化数组,可以通过以下方式完成(使用GCC):
UPD (感谢Chris Lutz备注)
像这样定义一个宏:
#define FUNCTION_VECTOR_COPY(destVec, sourceVec) memcpy(destVec, sourceVec, sizeof(sourceVec))
使用Compound Literals传递源向量,如下所示:
#include <string.h>
...
void (*functions[256])();
...
FUNCTION_VECTOR_COPY (functions, ((void(*[])()) {func1, func2, func3}));