Указатели на функции в C: предупреждение: назначение из несовместимого типа указателя [-Wincompatible-pointer-types] - PullRequest
0 голосов
/ 15 января 2019

Рассмотрим следующие объявления частных функций:

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);

1 Ответ

0 голосов
/ 15 января 2019

Тип второго аргумента отличается между функциями и переменной-указателем функции.

В функциях это указатель на const, которого нет в переменной указателя функции.

Тип должен быть точно таким же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...