Рассмотрим следующие объявления частных функций:
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*
и аргументы совпадают, поэтому я не могу сказать, в чем проблема.
Вызов выглядит следующим образом (никаких жалоб от компилятора, и я проверил, что каждый раз вызывается правильная функция):
(*ParseConfigGeneric)(num_param, config_param);