Prototype scope is now ANSI-compliant when compiling with the /Za command-line option. This means that if you declare a struct or union tag within a prototype, the tag is entered at that scope rather than at global scope. For example, under ANSI you can never call this function without getting a type mismatch error:
void func1( struct S * );
To correct your code, define or declare the struct or union at global scope before the function prototype:
struct S;
void func1( struct S * );
Under /Ze, the tag is still entered at global scope.