They are different languages, with different rules.
In C, function parameters must have names; I'm surprised that you get a warning rather than an error. I guess the rationale is that there's no good reason for an unused parameter; if you don't need it, then why should it exist? (Of course, there are valid cases for ignoring parameters, such as when using function pointers that specify a particular set of arguments; presumably, the powers that be didn't consider that common enough to be worth relaxing the rules for. If you need to ignore it, then (void)unused;
should suppress any "unused parameter" warnings you might otherwise get.)
In C++, functions must often have a particular signature, in order to override a virtual function declared in a base class, or to match a particular usage of a template parameter. It's quite possible that not all the parameters of that signature are required for all overrides, in which case it's quite reasonable to ignore that parameter. I'm guessing that that's the rationale for allowing you to leave it unnamed.