在外部文件中填充函数指针数组(C)

Fill function pointer array in external files (C)

一段时间以来,我一直在为函数指针而苦苦挣扎。也许你们可以帮助我。

在我的项目中,同一设备有多种功能,每种功能都写在自己的 .c 文件中。通用功能(适用于所有设备功能)写在 generic.c.

我想在通用 c 文件中创建一个函数指针数组,并将该数组填充到其他函数文件中。所以我可以根据通用文件中的设备功能标识符调用正确的功能。

我现在拥有的:

// in generic.h:
typedef void (*func_ptr_t[])(arguments);
extern func_ptr_t devFunctions[3];

我想:

// in function1.c:
#include "generic.h"

devFunctions[1] = &functionName;

但随后它抱怨缺少类型说明符并且数组初始值设定项必须是列表。如果我添加类型

func_ptr_t devFunctions[1] = &functionName;

我收到关于不完整元素类型的错误 'func_ptr_t'。

我无法从一个文件初始化整个数组列表,因为它是由多个文件填充的。

有人知道如何解决这个问题吗?

谢谢!

-编辑-

因为您不能在函数之外使用语句,所以我更改了我的应用程序。现在它不再使用数组,它会在调用特定函数文件时更新 generic.c 中的函数指针。

所以最终结果:

在generic.h中:

typedef void (*func_ptr_t)(<function arguments>)

在generic.c中:

func_ptr_t devFunction;

在function1.c中:

#include "generic.h"
extern func_ptr_t devFunction;

void functionToBeCalledFromMain( void ){
    devFunction = functionName;
}

void functionName (void ){
    // Function to be called from generic.c via function pointer
}

将以上评论放在一起,您可能想要

typedef void (*func_ptr_t)(arg_type_list);

有关 int f(int); 类型函数的示例,您可以查看:

/* function definition */
int functionName(int arg)
{
    /* do things */
    return arg * 2;
}

/* create the type "function pointer int->int" */
typedef int (*func_ptr_t)(int);

/* create the array */
func_ptr_t devFunctions[3];

int main(void)
{   
    /* associate the good function */
    devFunctions[0] = &functionName;

    /* call it with an arg */
    return devFunctions[0](42);
}

正如你们大多数人指出的那样,填充数组是一个不能放在函数外部的语句(呃...)。所以我想要的在这种情况下并不会真正起作用。我重写了我的应用程序以在每个 运行 上用我需要的函数更新函数指针(不再是数组)。省去很多麻烦:)

谢谢大家!