Как я помню, ранний C (например, K & R) позволял передавать что-либо при любом вызове функции, поэтому соглашение о вызовах должно было заключаться в том, что аргументы помещаются справа налево, и вызывающая сторона очищает стек после возврата функции.
Я столкнулся с загадкой в презентации, где решение заключается в вызове printf
без использования каких-либо заголовочных файлов.Он утверждает, что в C, если вы вызываете функцию, которая не была объявлена, компилятор неявно принимает свой список параметров в качестве переданных аргументов, которые он видел, вы передаете.
Но новая функция с поддержкой прототипов, вызывающая этобыл введен при запуске ANSI C использует более эффективное соглашение о вызовах, где вызываемая функция очищает стек;это не повторяется при каждом использовании.
Насколько я помню, двум формам были присвоены разные видимые линкером имена, и они были несовместимы, и это было обнаружено во время ссылки.Я утверждал, что его пример сработал, потому что printf
целенаправленно использует старую форму, чтобы разрешить передачу чего-либо и что-либо на основе вызова по вызову.
Он говорит, что оба используют , должен быть совместимым, предусмотренным стандартом.Я не понимаю, как это может работать, если компилятор не всегда генерирует вызовы старого стиля.
Какова реальная ситуация в соответствии со стандартом?И какова история этого - она изменилась со временем?