Цель моей задачи овладеть макросами
А при чём тут макросы? Ты, возможно, не знаешь, но getc() и getchar() тоже реализованы часто в виде макросов. Чтобы ими пользоваться, не нужно этого знать. Тут то же самое.
Все функции с переменным числом аргументов основаны на одном принципе: есть обязательный аргумент, несущий в себе информацию о необязательных. Он может быть строкой, но может быть и числом, а может быть вообще структурой. При входе в функцию из него извлекается информация о необязательных аргументах (их количество и тип каждого). А потом эта информация используется для получения самих аргументов.
Сначала ставится указатель на последний обязательный аргумент, а потом от этой позиции делаются переходы по аргументам в соответствии с размерами их типов.
Чтобы адреса и размеры вручную не вычислять каждый раз, сделаны удобные макросы - va_start(), va_arg(), va_end().