Both define a function returning void, and accepting zero arguments.
They define `func' with different types. The first type is a type with a prototype, the second type is without a prototype.
If in a function call expression the expression designating the function has a type without a prototype, and any arguments
are passed, compiler is not required to diagnose an error, but the behaviour is undefined.
void f();
f(x); //UB, no diagnostic
void f(void);
f(x); //diagnostic
This is only undefined behaviour when the actual function f has not a single parameter. "void f();" declares a function f that returns void with an unspecified number of parameters of unspecified type. So f(x) is undefined behaviour if the actual function does *not* have a single parameter.