Slavka_online
@Slavka_online
Интересная личность

Чистый С и переменное число аргументов?

В общем хочу для себя решить такую задачу на чистом С, чтоб одной функций инициализировать любые структуры, вот мой план написать функцию которая принимала бы первым аргументом void* а потом шел список оргументов и я просто по смещению к указателю их добавлял, но не знаю как это реализовать. Цель моей задачи овладеть макросами, я загунлил что __va_args__ получает переменное число аргументов переданное в макрос, но как вытащить элементы поодиночке?
  • Вопрос задан
  • 163 просмотра
Пригласить эксперта
Ответы на вопрос 2
Работа с аргументами обычно идет через va_start / va_arg / va_end. Но вам все равно надо каким-то образом передавать типы структур, как это делает printf() например, или хранить их описания в каком-то формате и передавать их.
Ответ написан
Комментировать
@abcd0x00
Цель моей задачи овладеть макросами

А при чём тут макросы? Ты, возможно, не знаешь, но getc() и getchar() тоже реализованы часто в виде макросов. Чтобы ими пользоваться, не нужно этого знать. Тут то же самое.

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

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

Чтобы адреса и размеры вручную не вычислять каждый раз, сделаны удобные макросы - va_start(), va_arg(), va_end().
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы