struct T
объявляет T
как struct
, даже если оно появляется в более крупном объявлении, то есть объявлении foo
. Тип является неполным, но это не имеет значения, когда он используется для объявления параметра функции указателя.
Без struct
компилятор ничего не знает о том, что T
должно быть.
Если T
ранее был объявлен как struct
, тогда void foo(T*)
будет разрешен в C ++, но не в C, потому что имена struct
s автоматически не становятся именами типов, хотя вы можете объявить typedef
с идентичным именем в Си, если хотите.