Массивы переменной длины C99 не поддерживаются в C

В Visual Studio 2005 я пытаюсь скомпилировать файл .c:

int i = 6;
int a[i];

Это не работает, так какому же стандарту соответствует мой компилятор?


person user103214    schedule 24.10.2011    source источник
comment
Обходной путь заключается в использовании malloc(), преимущество которого заключается в том, что он позволяет обнаруживать ошибки распределения.   -  person Keith Thompson    schedule 24.10.2011
comment
Я читаю книгу, соответствующую стандарту C89/C99. мне купить новую книгу? также я не знаю о gcc.   -  person user103214    schedule 24.10.2011
comment
Какая это книга? О стандарте C99, безусловно, стоит знать, но Microsoft очень медленно принимает его. Лучше всего знать, какие функции являются новыми в C90, а какие доступны в C90 (который поддерживают практически все компиляторы).   -  person Keith Thompson    schedule 24.10.2011
comment
Это книга, я не знаю, книга неправильная или компилятор неправильный.   -  person user103214    schedule 24.10.2011
comment
Я слышал хорошие отзывы об этой книге, хотя сам ее не читал. Ни книга, ни компилятор на самом деле не ошибаются. Книга, по-видимому, описывает версию языка C 1999 года; компилятор реализует (более или менее) версию 1990 года. Массивы переменной длины были добавлены в язык в 1999 году.   -  person Keith Thompson    schedule 24.10.2011


Ответы (1)


Visual Studio поддерживает только C89/90. У них нет поддержки C99. Поэтому вы не можете использовать массивы переменной длины в Visual Studio. Кроме того, Microsoft не планирует добавлять поддержку C99 в свой компилятор C.

person Mysticial    schedule 24.10.2011
comment
VS даже не поддерживает C89. Он поддерживает некоторое искажение C, с которым застряла MS... - person R.. GitHub STOP HELPING ICE; 24.10.2011
comment
@Р..: Правда? Из того, что я слышал, у него довольно приличная поддержка стандарта C89/C90 (хотя вам нужно указать некоторые параметры, отличные от значений по умолчанию). - person Keith Thompson; 24.10.2011
comment
По крайней мере, он не может корректно поддерживать широкосимвольные интерфейсы, добавленные в 1995 году; например, wprintf(L"%s\n", "hello"); не работает. Я не могу сразу придумать примеры, но я почти уверен, что существуют серьезные проблемы несоответствия с некоторыми исходными функциями C89 и, возможно, с поведением препроцессора. - person R.. GitHub STOP HELPING ICE; 24.10.2011
comment
@R.. Хм, должно wprintf(L"%s\n", "hello"); работать? Я уверен, что он должен поддерживать либо wprintf(L"%hs\n", "hello");, либо wprintf(L"%s\n", L"hello");... - person Medinoc; 18.06.2013
comment
@Medinoc: он должен напечатать строку hello, за которой следует новая строка, на стандартный вывод, как того требует язык C. Ваш первый вариант неверен; %hs является недопустимым спецификатором формата. Второй вариант также неверен. %s требует в качестве аргумента указатель на строку (массив char, заканчивающийся нулем), а не указатель на широкую строку. - person R.. GitHub STOP HELPING ICE; 18.06.2013
comment
Вау, ты прав. Стандарт говорит, что %s всегда означает узкую строку, а не строку той же ширины, что и функция, и для последней нет спецификатора. Коварный и контринтуитивный. - person Medinoc; 18.06.2013