Код
#include <stdarg.h>
void foo(unsigned char a, ...);
unsigned char A[5];
void foo(unsigned char a, ...)
{
char i;
va_list arg_ptr;
va_start(arg_ptr, a);
for(i = 0; i < a; ++i)
A[i]=va_arg(arg_ptr, unsigned char);
va_end(arg_ptr);
}
void main(void)
{
unsigned char b = '4', c = 'A';
foo (5,23,b,32,c);
}
void foo(unsigned char a, ...);
unsigned char A[5];
void foo(unsigned char a, ...)
{
char i;
va_list arg_ptr;
va_start(arg_ptr, a);
for(i = 0; i < a; ++i)
A[i]=va_arg(arg_ptr, unsigned char);
va_end(arg_ptr);
}
void main(void)
{
unsigned char b = '4', c = 'A';
foo (5,23,b,32,c);
}
т.е. заполнение массива указанным числом аргументов, результат её работы получил следующий
A[] = {0x17, 0x00, 0x34, 0x00, 0x20}
как видно компилятор приводит мои аргументы к int. Для передачи числа 23 или 32 это еще можно понять, но как быть с явно указанными b и c ?
Попробовал данный код в Image Craft - результат тот-же, а вот Code Vision поступил честно (?)
и передал все параметры b и c как char.
Далее читаю help от IAR и узнаю что аргументом не может быть any integer type that changes when promoted естественно возник интерес к слову promoted и поиск по help дал следующее
Argument promotion occurs when the type of the function fails to provide any information about an argument. Promotion occurs if the function declaration is not a function prototype or if the argument is one of the unnamed arguments in a varying number of arguments. In this instance, the argument must be an rvalue expression.
на основании перевода (возможно неправильного) стало понятно что должна существовать возможность указания типа аргумента для неименованых аргументов в функции с переменным их числом, но как это сделать ... ?
PS: в книгах по С все приводимые примеры относятся к типу int
