Я сомневаюсь, что есть способ сделать это.Причина в том, что количество параметров вашей функции lisp известно только во время выполнения, но количество аргументов функции C должно быть известно во время компиляции.
Сюда входят списки va_lists, если вы не хотите взламывать их каким-либо образом для конкретной платформы.
Лучшее, что вы действительно можете сделать, это написать функцию на C, которая способна циклически перебирать аргументы по одному и что-то делать с ними.Единственный способ обойти это - не только сохранить указатель на функцию для каждой из ваших внутренних функций, но и сохранить «соглашение о вызовах», которое даст информацию о том, принимает ли он параметры обычным способом или заканчивается ли он наэквивалент va_list.
Такие функции, как printf, будут иметь оболочку, скажем, printf_wrapper, и вы сохраните указатель функции на оболочку.Эта оболочка будет принимать строку формата в качестве обычного параметра, за которым следует список или массив других параметров (примерно аналогично va_list).
Вы можете указать, что printf_wrapper заканчивается параметром, который ожидает список, указав соглашения о вызовах для функции printf_wrapper как "va_list_type", что означает, что он принимает обычные фиксированные параметры, и что все остальные параметры должны быть связаныи передается в виде списка.
Конечно, написание функции printf_wrapper, которая может разбивать и анализировать строку формата на несколько строк формата, - это немного трудоемко.Вот пример, где я сделал именно это, чтобы я мог добавить свои собственные спецификаторы формата:
https://github.com/wbhart/bsdnt/blob/v0.26/helper.c