Как узнать когда кончатся параметры va_arg?

В языке программирования C параметры переменной длины (varargs) передаются через механизм va_list, va_start, va_arg и va_end из библиотеки stdarg.h. va_list - это тип данных, используемый для хранения информации о параметрах переменной длины. va_start и va_end - макросы, используемые для инициализации и завершения обработки параметров переменной длины. А va_arg - макрос, используемый для доступа к каждому аргументу переменной длины.

Теперь, чтобы узнать, когда параметры va_arg кончатся, нужно иметь информацию о типах и количестве передаваемых аргументов.

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

Вот пример, как это может выглядеть в коде на языке C:

#include <stdarg.h>
#include <stdio.h>

void my_function(int count, ...)
{
    va_list args;
    va_start(args, count);
    
    for (int i = 0; i < count; i++)
    {
        int arg = va_arg(args, int);
        printf("%dn", arg);
    }
    
    va_end(args);
}

int main()
{
    my_function(5, 1, 2, 3, 4, -1);
    
    return 0;
}

В этом примере my_function принимает первым аргументом count - количество аргументов, а затем обрабатывает оставшиеся аргументы функцией va_arg. В данном случае мы ожидаем 5 аргументов с целочисленными значениями, и -1 используется в качестве маркера окончания списка аргументов.

Если вы не знаете заранее количество передаваемых аргументов или не используете сентинела, то нет способа точно определить, когда параметры va_arg кончатся. Это может привести к неопределенному поведению или ошибкам во время выполнения программы. Поэтому необходимо явно указывать, сколько аргументов ожидаем и использовать сентинел, чтобы обозначить их конец.