Компилятор на самом деле не делает ничего особенного. Во время компиляции, когда вызывается функция, компилятор, как обычно, генерирует код для последовательной загрузки всего списка аргументов в стек (часто в обратном порядке, зависит от соглашения о вызовах).
В этом случае вызываемый абонент обязан обнаруживать и ссылаться на эти аргументы из стека. Для этого вызываемый должен знать количество аргументов, а также адрес стековой памяти первого аргумента (это всегда известное смещение от указателя кадра стека). Чтобы определить количество аргументов, эта информация должна быть сообщена. Это часто достигается следующими способами:
- Первый аргумент - это целое число, которое явно указывает количество аргументов
прийти.
- Информация кодируется внутри первого аргумента, например, для
printf
.
Часто C-макросы используются для автоматизации этого и инкапсулируют некоторые из этих деталей. См .: stdarg.h Макросы