Массивы переменной длины в C89? - PullRequest
9 голосов
/ 12 ноября 2010

Я читал, что C89 не поддерживает массивы переменной длины, но следующий эксперимент, кажется, опровергает это:

#include <stdio.h>

int main()
{
   int x;
   printf("Enter a number: ");
   scanf("%d", &x);
   int a[x];
   a[0] = 1;
   // ...
   return 0;
}

Когда я компилирую как таковой (при условии, что имя файла va_test.c):

gcc va_test.c -std=c89 -o va_test

Работает ...

Чего мне не хватает?: -)

Ответы [ 3 ]

10 голосов
/ 12 ноября 2010

GCC всегда поддерживает массивы переменной длины AFAIK.Установка -std в C89 не отключает расширения GCC ...

Редактировать: Фактически, если вы отметите здесь:

http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html#C-Dialect-Options

Under -std = youнайдет следующее:

программы ISO C90 ( определенные расширения GNU, конфликтующие с ISO C90, отключены).То же, что -ansi для кода C.

Обратите особое внимание на слово "определенный".

7 голосов
/ 12 ноября 2010

C89 не распознает // комментариев.

C89 не позволяет определениям, смешанным с кодом.

Вам необходимо fflush(stdout) после printf, чтобы быть уверенным в том, что вы видитезапрос перед scanf.

main «выглядит лучше» как int main(void)

Попробуйте gcc -std=c89 -pedantic ... вместо

2 голосов
/ 12 ноября 2010

Вам не хватает того, что без -pedantic gcc не является (и не претендует на то, чтобы быть) соответствующим C компилятору. Вместо этого он компилирует GNU-диалект C, который включает в себя различные расширения.

...