如何在C中定义函数数组

我有一个包含这样的声明的结构:

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所说的修正了语法错误。

我有一个包含这样的声明的结构:

不,你没有。 这是一个语法错误。 您正在寻找:

 void (*functions[256])(); 

这是一个函数指针数组。 但请注意, void func()不是“不带参数且不返回任何内容的函数”。 它是一个函数,它接受未指定的数字或类型的参数,并且不返回任何内容。 如果你想要“没有参数”,你需要这个:

 void (*functions[256])(void); 

在C ++中, void func() 确实意味着“不带参数”,这会引起一些混淆(特别是因为C指定的void func()具有可疑值。)

不管怎样,你应该输入你的函数指针。 它将使代码更容易理解,并且您只有一次机会(在typedef )来获取语法错误:

 typedef void (*func_type)(void); // ... func_type functions[256]; 

无论如何,您无法分配给数组,但您可以初始化数组并复制数据:

 static func_type functions[256] = { /* initializer */ }; memcpy(struct.functions, functions, sizeof(functions)); 

你可以动态地做…这是一个用malloc分配的动态函数数组的一个小例子…

 #include  #include  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] = (FOO_FUNC)&a; pFoo[1] = (FOO_FUNC)&b; pFoo[0](10); pFoo[1](20); return 0; } 

我遇到了同样的问题,这是我测试解决方案的小程序。 它看起来非常简单,所以我想我会为未来的访客分享它。

 #include  int add(int a, int b) { return a+b; } int minus(int a, int b) { return ab; } 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; } 

从我的头顶和未经测试。

 // 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所说的语法错误。

您可以在声明结构实例时执行此操作:

 function_structur fs = { struct_field1, struct_field2, {function0, function1, ..., function255}, struct_field3, ... }; 

在声明数组后,不能使用此快捷方式初始化数组:如果需要这样做,则必须动态地执行它(使用循环, memcpy或其他东西)。

如果要使用{func1, func2, ...}等forms对数组进行初始化,可以通过以下方式完成(使用GCC):

UPD (感谢Chris Lutz的评论)

像这样定义一个宏:

 #define FUNCTION_VECTOR_COPY(destVec, sourceVec) memcpy(destVec, sourceVec, sizeof(sourceVec)) 

并使用Compound Literals传递源向量,如下所示:

 #include  ... void (*functions[256])(); ... FUNCTION_VECTOR_COPY (functions, ((void(*[])()) {func1, func2, func3}));