Как передать параметры в функцию, которая не ограничивает количество параметров? - PullRequest
2 голосов
/ 13 августа 2010

Мне показалось, что функция наподобие printf () не ограничивает количество параметров.

Но при отладке программы в Solaris я заметил, что она помещает в стек максимум 5 параметров, общий регистр будетиспользоваться, если имеется более 5 параметров.

Так что же произойдет, если даже общий регистр не достаточно в функции, такой как printf?Компилятор сделал что-то для меня?

Ответы [ 2 ]

4 голосов
/ 13 августа 2010

Поведение контролируется ABI для платформы.Если в регистрах больше параметров, чем умещается, то они будут обрабатываться другим способом.Не существует простого верхнего предела для количества передаваемых аргументов, поэтому компилятор и ABI определяют механизм, который работает на рассматриваемом оборудовании.То, что работает на SPARC, не обязательно работает, например, на Intel IA32.

0 голосов
/ 13 августа 2010

Обычно платформы, где ABI использует регистры для передачи аргументов, переключаются на другое соглашение о вызовах для функций с переменными числами, при котором все передается в стеке. Вот почему стандарт C назначил неопределенное поведение для вызова функции с переменными параметрами без прототипа; без прототипа на таких платформах компилятор сгенерирует неверный вызов.

Следует отметить, что некоторые платформы используют более сложные (я бы сказал, бесполезно сложные) методы передачи аргументов в функции с переменными числами, такие как создание своего рода связанного списка и передача скрытого указателя на этот список, реализация которого va_start тогда как-то способен получить. Как программист, вы должны просто относиться ко всему stdarg.h как к черному ящику, который делает то, что ожидается, и молиться, чтобы вам никогда не приходилось видеть мрачные детали некоторых из уродливых реализаций ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...