Предоставленный (упрощенный) фрагмент кода:
void foo(int a, int b); // declaration with prototype
int main(void)
{
foo(1, 5); // type-checked call (i.e. because of previous prototype)
return 0;
}
void foo() // old-style definition (with empty argument list)
{
}
и параметры командной строки (хотя, как я уже сказал, они не важны):
-x c -std=c11 -pedantic -Wall
gcc 7.2 не удается скомпилировать его со следующим сообщением об ошибке:
error: количество аргументов не соответствует прототипу
в то время как clang 4.0 переводит его без каких-либо жалоб.
Какая реализация правильна в соответствии со стандартом C? Действительно ли старое определение "отменяет" предыдущий прототип?