Ваша функция, принимающая переменные аргументы, должна каким-то образом сообщать, когда она достигла конца переменных аргументов. Это может быть путем анализа информации из фиксированных аргументов (например, аргумента, который сообщает вам, сколько переменных было передано, или строки формата, которая сообщает вам, какие аргументы должны следовать), или это может быть явное значение дозорного, например, как нулевой указатель в конце аргументов переменной.
Вы, кажется, хотите крупного чуда; Извините, доступны только незначительные чудеса.
Вы можете создавать свои интерфейсы следующим образом:
int test1(int x, struct list *list) { ...code to handle adding x to arbitrary list... }
int test0(int x) { return test1(x, &global_struct); }
Затем вы вызываете test0()
, если хотите использовать список по умолчанию, и test1()
, если хотите указать другой список.
Обратите внимание, что test0()
настолько прост, что это хороший кандидат для определения функции C99 inline
.
Если бы вы использовали C ++, вы могли бы предоставить функцию с аргументом по умолчанию или перегруженной функцией (два списка аргументов и реализации, как указано выше, но с тем же именем). Конечно, даже больше, чем в C, использование глобальных переменных не рекомендуется в C ++.