Как компилятор C реализует функции с переменным числом аргументов? - PullRequest
13 голосов
/ 29 апреля 2010

Я посетил техническое интервью несколько дней назад, и меня спросили Как компилятор C функционирует с переменным числом аргументов? Как это передать в стеке?

Кто-нибудь знает или может объяснить это?

Спасибо, Dan

Ответы [ 4 ]

10 голосов
/ 29 апреля 2010

Насколько я знаю, с C ...

  • функция вызывающей стороны помещает аргументы в стек в порядке справа налево.

  • вызывающая сторона отвечает за удаление аргументов из стека после выполнения вызываемой функции. Вероятно, это именно потому, что вызывающей стороне гарантированно известно, сколько аргументов она помещает в стек, а вызываемая функция может ошибиться.


P.S .: Соглашения о вызовах обычно зависят от реализации . То, что я только что описал, известно как соглашение о вызовах "cdecl". Сравните это с соглашением о вызовах, обычно известным как "stdcall", где вызываемая функция отвечает за удаление своих аргументов из стека. По этой причине он не поддерживает списки аргументов переменной длины.


P.P.S.: Как прокомментировал пользователь nategoose, я не упомянул, как списки аргументов переменных на самом деле используются . Смотрите, например документация POSIX для заголовка <stdarg.h> для получения дополнительной информации.

7 голосов
/ 29 апреля 2010

Он реализует их, используя макросы va_ - например, va_start . Именно то, что делают эти макросы, определяется реализацией - другими словами, оно будет варьироваться от архитектуры процессора к архитектуре и от компилятора к компилятору. Но они должны подшучивать над стеком вызовов C. Как правило, это будет включать в себя использование адреса последнего названного параметра в качестве базы и последующий доступ к переменным параметрам, выполняя арифметику указателей на этой основе.

0 голосов
/ 29 апреля 2010

Насколько вам грустно, что вы получили этот вопрос на техническом собеседовании, я предполагаю, что правильный ответ будет:

Вызывающий объект помещает явные параметры в стек, количество переменных параметров и сами параметры переменных. Тогда код целевой функции будет отвечать за вывод всех параметров на основе переданного количества и его стекового адреса.

И добавьте несколько идей, почему не удобно размещать эти параметры в отдельном массиве.

0 голосов
/ 29 апреля 2010

Посмотрите на va_start, va_arg и va_end. Здесь - тонна информации об этом.

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