ARV писал(а):разве что при использовании расширений стандарта (например, GCC вполне позволяет делать локальные массивы с вычисляемым по ходу пьесы размером).
VLA - Variable-Length Array - это не расширение GCC, а стандарт
C99, долгих лет ему жизни.
И в локальных переменных, и в параметрах
Код: Выделить всё
int foo( int sx, int sy, int array[sy][sx] ) {
int temp = 0;
for( int y = 0; y < sy; ++y)
for( int x = 0; x < sx; ++x )
temp += array[y][x];
return temp;
}
Без VLA тут пришлось бы передавать int *array и вручную индексировать.
Просто, как минимум поначал, часть компиляторов, декларирующих соответствие C99, ограничились поддержкой комментариев "стиля С++", объявлением переменных "по месту", включая for( int i =0; и так далее, да inline. На этом фоне полная поддержка C99 в GCC начала казаться расширениями

Вот что gcc расширил, так С99-е понятие _Complex на целочисленные типы:
Код: Выделить всё
signed char _Complex a, b, c;
void foo()
{
a = b * c;
}
avr-gcc -Os -std=c99 -S -mmcu=atmega8 complex.c --pedantic
complex.c:2:1: warning: ISO C does not support complex integer types [-pedantic]
Всего лишь warning, а без --pedantic так молча ест.
Код: Выделить всё
foo:
lds r18,b
lds r24,b+1
lds r20,c
lds r19,c+1
mul r20,r18
mov r25,r0
clr r1 ; зря он R1 каждый раз чистит, но это просто недостаток оптимизатора
mul r19,r24
mov r21,r0
clr r1
sub r25,r21
sts a,r25
mul r20,r24
mov r24,r0
clr r1
mul r19,r18
mov r18,r0
clr r1
add r24,r18
sts a+1,r24
ret
Куда бы эту гайку М3 прикрутить...
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.