Я нахожу ошибку, говоря «ошибка: назначение выражению с типом массива» для моей следующей части кода, скомпилированной в gcc 6.1.0, но не в gcc 4.4.6.Ошибка обнаружена только в gcc-6.1.0 при анализе аргументов с использованием va_arg()
void foo(char *fmt, ...)
{
va_list ap;
int d;
char *c, *s;
typedef unsigned char mac_t[6];
mac_t ad;
va_start(ap, fmt);
while (*fmt)
switch (*fmt++) {
case 's':
s = va_arg(ap, char *);
printf("string %s\n", s);
break;
case 'd': /* int */
d = va_arg(ap, int);
printf("int %d\n", d);
break;
case 'c': /* char */
ad = va_arg(ap, mac_t); //**** error here only on gcc 6.1.0 compiler
printf("With unsigned char: char %c.%c.%c.%c.%c.%c\n", ad[0],ad[1],ad[2],ad[3],ad[4],ad[5]);
}
va_end(ap);
}
int main()
{
foo("%c", "AABBCC");
}
Как я могу решить эту ошибку? В gcc 4.4.6 компиляция проходит гладко. По некоторым причинам мне нужно использовать только компилятор gcc 6.1.0.
Я попробовал strcpy (ad, va_arg (ap, mac_t)) ;. Это не дает мне никакой ошибки компилятора. Но это не служит цели. Я имею в виду, что аргументы не копируются в объявление массива. При печати содержимого объявления я вижу недопустимые данные. –
Массивы распадаются на тип указателя при передаче функции. gcc 6.1.0 исправляет это, вы не можете назначить массив. – jxh
@jxh Точно. strcpy() не работает с указателями. Любой другой способ проанализировать аргументы в gcc 6.1.0? –