C typedef: параметр имеет неполный тип - PullRequest
3 голосов
/ 16 декабря 2008

GCC 3.4.5 (версия MinGW) выдает предупреждение: параметр имеет неполный тип для строки 2 следующего кода C:

struct s;
typedef void (* func_t)(struct s _this);
struct s { func_t method; int dummy_member; };

Есть ли способ исправить это (или хотя бы скрыть предупреждение), не меняя сигнатуру аргумента метода на (struct s *)?

Примечание:
Относительно того, почему что-то подобное может быть полезным: в настоящее время я работаю с объектно-ориентированной структурой; 'method' - это запись в таблице диспетчеризации, и из-за особенностей структуры фреймворка имеет смысл передавать '_this' по значению, а не по ссылке (как обычно это делается) ...

Ответы [ 5 ]

1 голос
/ 17 декабря 2008

Переключение на GCC 4, похоже, должно работать. MinGW версия 4.3.0: http://sourceforge.net/project/showfiles.php?group_id=2435&package_id=241304&release_id=596917

1 голос
/ 16 декабря 2008

Вы не можете сделать это легко - в соответствии со стандартом C99 , раздел 6.7.5.3, параграф 4:

После настройки параметры в списке типов параметров в объявителе функции, который часть определения этой функции не должна иметь неполный тип.

Поэтому вы можете сделать так, чтобы функция взяла указатель на структуру или указатель на функцию немного другого типа, например, функцию, принимающую неопределенные параметры:

typedef void (* func_t)(struct s*);  // Pointer to struct
typedef void (* func_t)(void *);     // Eww - this is inferior to above option in every way
typedef void (* func_t)();           // Unspecified parameters
0 голосов
/ 24 декабря 2008

Предупреждение, похоже, является ошибкой с текущей версией MinGW gcc. Вопреки сказанному Адамом, это является действительным C99 - раздел 6.7.5.3, пункт 12 явно разрешает это:

Если декларатор функции не является частью определения этой функции, параметры могут иметь неполный тип и могут использовать нотацию [*] в своих последовательностях спецификаторов объявления для указания типов массива переменной длины.

Кажется, что нет способа дать указание (этой версии) gcc не печатать это предупреждение - по крайней мере, I не смог найти работающий переключатель - поэтому я просто пока его игнорирую.

0 голосов
/ 16 декабря 2008

Вы хотите вызвать его с помощью указателя функции. Почему бы не использовать вместо этого указатель void?

typedef void (*func_t)(void*);

Вы МОЖЕТЕ также иметь возможность передавать указатель на функцию со свободной типизацией; У меня нет компилятора под рукой.

typedef void (*func_t)(void (*)());
0 голосов
/ 16 декабря 2008

Как правило, скрыть предупреждения довольно просто - просто посмотрите на справку для вашего конкретного компилятора.

http://developer.apple.com/documentation/DeveloperTools/gcc-4.0.1/gcc/index.html#//apple_ref/doc/uid/TP40001838

Обратите внимание, что подавление предупреждений, как правило, не то, что я бы отстаивал.

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