У меня есть функция, которая выглядит как
void demo_function_v(const char * mask, va_list ap)
{
for (; *mask; mask++) {
// get one or more args from ap, depending on *mask
}
}
Это работает в системе AVR, которая имеет различные методы доступа к флэш-памяти. Чтобы дублировать эту функцию, я хотел бы извлечь ее основную часть:
void demo_function_1char(char mask, va_list ap)
{
// get one or more args from ap, depending on mask
}
void demo_function_v(const char * mask, va_list ap)
{
for (; *mask; mask++) {
demo_function_1char(*mask, ap)
}
}
Увы, это не гарантирует работу, т.к.
Объект
ap
может быть передан в качестве аргумента другой функции; если эта функция вызывает макросva_arg
с параметромap
, значениеap
в вызывающей функции неопределенно.
И это правда - на х86 не работает, на х64 работает. Если это работает на AVR, я смогу проверить завтра. Но я бы предпочел не полагаться на это, если оно описывается как «неопределенное» (что якобы является своего рода УБ).
Таким образом, я хотел бы пойти другим путем:
void demo_function_1char(char mask, va_list * pap)
{
// get one or more args from *pap, depending on mask
}
void demo_function_v(const char * mask, va_list ap)
{
for (; *mask; mask++) {
demo_function_1char(*mask, &ap)
}
}
Это должно сработать, или я так же прострелю себе ногу?