Поскольку сигнатуры функций различны, это не является допустимым C или юридическим C ++. Вопрос в том, почему компиляторы относятся к этому по-разному. Ни в одном из стандартов нет большого руководства о том, что делать с программами, которые нарушают стандарт, за исключением того, что для определенных нарушений требуется диагностика (и оба этих случая предоставляют диагностическое сообщение). Стандарты обычно касаются того, что является действительной программой на C или C ++, и что должна делать реализация, когда она предоставляется.
C - значительно более старый язык, чем C ++, и большая часть кода на C была написана на гораздо менее строгих компиляторах, чем сегодня. C ++ был более строгим с самого начала, и поэтому предстандартный код C ++, как правило, является допустимым стандартным кодом C ++, который просто не использует определенные функции.
По этой причине компилятор C более склонен к снисхождению, чем компилятор C ++, предполагая, что компиляторы были написаны для практического использования. В конце концов, есть много кода на C, который беспечно предполагает такие вещи, как эта работа, и кое-что из этого очень полезно, но то же самое нельзя сказать о C ++.