2010-11-11 1 views
9

Я читал, что C89 не поддерживает массивы переменной длины, но следующий эксперимент, кажется, что опровергать:Массивы переменной длины в 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 

Это работает ...

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

+0

Я не верю тебе. '-std = c89' также запрещает инструкции перед объявлениями переменных, которые имеют ваш код, поэтому возникла бы ошибка компилятора, если вы действительно скомпилированы с помощью' -std = c89'. По умолчанию используется '-std = gnu90', который поддерживает vlas и множество других расширений языка C89/C90. –

+0

@R. GCC 4.3.4 (это то, что у меня есть), доволен переменными, но не любит комментарии '//'. Мне не совсем ясно, является ли '// ...' дословным из реального кода опроса, или он предназначен как элиция. Я бы подумал об этом. –

+0

Нечетные. Я думаю, это зависит от версий gcc, и я не пробовал это некоторое время. –

ответ

10

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

Edit: На самом деле, если вы проверите здесь:

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

Под -std = вы найдете следующее:

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

Обратите особое внимание на слово «определенное».

+3

На этой странице показан этот пример: http://www.network-theory.co.uk/docs/gccintro/gccintro_28.html – caveman

+0

@caveman: Хорошая ссылка :) – Goz

2

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

+0

Вы также можете использовать '-pedantic-errors' чтобы заставить ошибки, а не предупреждения. –

+3

@Matthew: да, если вы недостаточно жестки для '-Werror' ;-) –

+0

Я определенно wimp – pmg

7

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

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

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

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

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

+1

:) ... напоминает мне первые несколько месяцев моей инженерной школы. Тогда нам пришлось кодировать стандартный код c89. 1 предупреждение с '-ansi - pedantic', и вы получили 0 ... добрые старые дни ... – log0

+0

Единственное, что я действительно хотел, чтобы C89 имел' for (int ... 'объявление переменной в предложении управления циклом - - oh и точные значения целочисленных типов – pmg

+0

Мне тоже нравятся переменные макросы, хотя я менее навязчивый, чем раньше, когда речь шла о разворачивании и выключении записи во всем моем коде. –

 Смежные вопросы

  • Нет связанных вопросов^_^