如何在C中定义函数数组

时间:2011-03-15 09:37:21

标签: c arrays function definition

我有一个包含如下声明的结构:

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所述。

6 个答案:

答案 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}));