我一直在为函数指针而苦苦挣扎一段时间了。也许你们可以帮助我。
在我的项目中,我为同一设备提供了多种功能,并且每个功能都编写在自己的.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 中的函数指针。
所以最终结果:
在通用.h中:
typedef void (*func_ptr_t)(<function arguments>)
在通用.c中:
func_ptr_t devFunction;
在函数 1.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
}
正如你们大多数人指出的那样,填充数组是一个不能放在函数之外的语句(duh...(。所以我想要的在这种情况下真的行不通。我重写了我的应用程序,以便在每次运行时使用我需要的函数更新函数指针(不再是数组(。省去很多麻烦:)
谢谢大家!
有关类型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);
}
把上面的评论放在一起,你可能想要
typedef void (*func_ptr_t)(arg_type_list);