Когда в 1999 году были введены VLA, я подумал, что это отличная инновация для языка. Однако, узнав, что это стало необязательным в C 2011, мне интересно, что привело к его изменению статуса, и означает ли это, что функция фактически устарела. Если да, существует ли эквивалентное понятие автоматического управления данными динамического размера, которое рассматривается для его замены?
Я попытался найти обоснование документа C 2011, но, похоже, он еще не опубликован.
Ответы:
Я слышал, что легенды варьируются от «это должно быть необязательным, поскольку некоторые небольшие компиляторы должны быть в состоянии быть совместимыми с C11 без VLA», «чтобы это была ошибка на первом месте». У меня никогда не было ни одного правдивого и однозначного ответа на это. В конечном счете, я не верю, что у кого-то действительно есть такой, потому что причина (если предположить - и надеюсь - она есть) никогда не была раскрыта (насколько мои старые поиски шли).
Из главы 4 (стр. 13) Обоснования международного стандарта - Языки программирования - C 5.10 (2003)
Акцент мой. Обратите внимание, что это решение противоречит их собственному обоснованию. Еще одна вещь, сделанная необязательной. Теперь вы либо получаете
__STDC_NO_VLA__
либо VLA поддержку. Это очень странное решение.источник
Насколько я могу судить по документам общественного комитета (в частности, N1395 ), одной из основных причин, по которой VLA (наряду со сложной арифметикой и многопоточностью) необязательно, было создание возможности создания соответствующих компиляторов Си для небольших встроенных процессоров.
Тенденция заключалась в том, что производители компиляторов, ориентированные на встраиваемые системы, придерживались стандарта C90 из-за введения тех крупных функций, о которых их клиенты не просили.
источник