C中的函数指针:警告:来自不兼容指针类型[-Wincompatible指针类型]的赋值

C中的函数指针:警告:来自不兼容指针类型[-Wincompatible指针类型]的赋值,c,function,pointers,gcc,C,Function,Pointers,Gcc,考虑以下私有函数声明: static void ParseCore(SI_32 num_param,const t_config_param config_param[CONFIG_PARAM_BUFFER_SIZE]); static void ParseGnss(SI_32 num_param,const t_config_param config_param[CONFIG_PARAM_BUFFER_SIZE]); static void ParseEaf(SI_32 num_param,c

考虑以下私有函数声明:

static void ParseCore(SI_32 num_param,const t_config_param config_param[CONFIG_PARAM_BUFFER_SIZE]);
static void ParseGnss(SI_32 num_param,const t_config_param config_param[CONFIG_PARAM_BUFFER_SIZE]);
static void ParseEaf(SI_32 num_param,const t_config_param config_param[CONFIG_PARAM_BUFFER_SIZE]);
static void ParsePps(SI_32 num_param,const t_config_param config_param[CONFIG_PARAM_BUFFER_SIZE]);
static void ParseImu(SI_32 num_param,const t_config_param config_param[CONFIG_PARAM_BUFFER_SIZE]);
在同一源文件中另一个函数的定义中,我初始化以下指针:

void (*ParseConfigGeneric)(SI_32, t_config_param*) = NULL;
以下所有作业都会在文章标题中显示警告:

ParseConfigGeneric = &ParseCore;
ParseConfigGeneric = &ParseGnss;
ParseConfigGeneric = &ParseEaf;
ParseConfigGeneric = &ParsePps;
ParseConfigGeneric = &ParseImu;
这里是GCC的输出:

../src/core/time_mgmt.c: In function ‘ParseConfigFile’:
../src/core/time_mgmt.c:753:32: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
             ParseConfigGeneric = &ParseCore;
                                ^
../src/core/time_mgmt.c:757:32: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
             ParseConfigGeneric = &ParseGnss;
                                ^
../src/core/time_mgmt.c:761:32: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
             ParseConfigGeneric = &ParseEaf;
                                ^
../src/core/time_mgmt.c:765:32: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
             ParseConfigGeneric = &ParsePps;
                                ^
../src/core/time_mgmt.c:769:32: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
             ParseConfigGeneric = &ParseImu;
不过,代码确实可以编译,而且似乎工作正常。我查找了类似的问题,但问题总是指针类型不同于原始函数,但在本例中,它们都是
void*
,并且参数匹配,因此我无法判断问题是什么

调用如下(编译器没有抱怨,我检查了每次调用的函数是否正确):


函数和函数指针变量之间第二个参数的类型不同

在函数中,它是指向
const
的指针,它不在函数指针变量中


类型必须完全相同。

函数和函数指针变量之间第二个参数的类型不同

在函数中,它是指向
const
的指针,它不在函数指针变量中


类型必须完全相同。

我添加了GCC的输出。此外,我还加上了丢失的“const”,问题就解决了。GCC指向赋值,而不是参数本身,这与我忘记常量时通常的做法不同,但我想这是另一种情况。谢谢你能不能把你的消息作为一个答案发布,这样我就可以验证它了?我添加了GCC的输出。此外,我还加上了丢失的“const”,问题就解决了。GCC指向赋值,而不是参数本身,这与我忘记常量时通常的做法不同,但我想这是另一种情况。谢谢你能不能把你的信息作为答案发出去,这样我就可以验证它了?
(*ParseConfigGeneric)(num_param, config_param);