Какая структура данных используется компилятором для списков переменных аргументов в C? - PullRequest
3 голосов
/ 06 июля 2011

При работе со списками переменных аргументов в C мне было просто интересно узнать, какую структуру данных может использовать компилятор при хранении переменных аргументов в списке.

  1. Это массив пустых указателей?
  2. Это связанный список пустых указателей?
  3. или что-нибудь еще?

Ответы [ 2 ]

3 голосов
/ 12 июля 2011

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

Например, в случае printf первый аргумент является фиксированным, строка ac, а остальные декодируются на основечто в строкеC просто предоставляет вам инструменты для доступа к этим элементам, поэтому вам не нужно делать арифметику указателя стека в зависимости от размера полей (который зависит от архитектуры ..)

1 голос
/ 13 июля 2011

Компилятор на самом деле не делает ничего особенного. Во время компиляции, когда вызывается функция, компилятор, как обычно, генерирует код для последовательной загрузки всего списка аргументов в стек (часто в обратном порядке, зависит от соглашения о вызовах).

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

  1. Первый аргумент - это целое число, которое явно указывает количество аргументов прийти.
  2. Информация кодируется внутри первого аргумента, например, для printf.

Часто C-макросы используются для автоматизации этого и инкапсулируют некоторые из этих деталей. См .: stdarg.h Макросы

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