C typedef: параметр имеет неполный тип

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» – это запись в таблице диспетчеризации, и из-за конкретного дизайна frameworks имеет смысл передавать «_this» по значению, а не по ссылке (как это обычно делается) …

Вы не можете сделать это легко – согласно стандарту 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 

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

Скрытие предупреждений, как правило, довольно просто – просто посмотрите на помощь для своего конкретного компилятора.

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

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

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

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

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

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

 typedef void (*func_t)(void*); 

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

 typedef void (*func_t)(void (*)());