why is this a warning rather than an error?
Поскольку существует много устаревшего кода, то оно написано таким образом. Ошибка компилятора нарушит его.
If the compiler cannot see the function, what happens when the function is called at runtime? Does the linker ultimately resolve this issue?
Давайте посмотрим пример:
int main()
{
foo();
return 0;
}
При работе компилятор генерирует свою собственную подпись функции, как int foo(...)
и будет использовать его. Кстати, это может привести к очень любопытным ошибкам. Таким образом, объектный файл будет содержать вызов этой функции, и это нормально. Когда вы попытаетесь связать его, вы получите сообщение об ошибке: undefined reference to foo. Но если у вас есть другой модуль с определением foo
, компоновщик найдет его по имени и свяжет его.
Or are we to assume that the behaviour of calling a function that produced such warning is unknown?
Как я уже сказал, это может привести к некоторым странным ошибкам. Представьте, что у вас есть код int i = foo()
и foo
без подписи. А в другом модуле у вас есть следующее: int * foo(){...}
. При создании приложения в режиме с 64 битами вы ставите в i
всего 32 бит 64-разрядного указателя. Таким образом, вы можете сказать, что поведение вашей программы может быть неизвестно.
Вы должны предположить, что функция может принимать любое число или тип аргументов и возвращать 'int'. По крайней мере, это то, что делает компилятор. Это может быть удалено в будущих версиях спецификации. – user3386109
Неявное правило 'int' больше не соответствует стандарту ... но может по-прежнему работать как расширение. Я не думаю, что в текущем стандарте есть что-то, что говорит, что компилятор * не может * предположить возврат 'int', его больше не требуется (и он должен выдать диагностику). – Dmitri