Если компилятор определяет __STDC_NO_VLA__, должен ли он по-прежнему поддерживать элементы гибкого массива? - PullRequest
0 голосов
/ 01 июля 2018

В C99 гибкие элементы массива (структуры) и массивы переменной длины были обязательными частями стандарта - соответствующие компиляторы C99 (реализации) должны поддерживать их обоих.

В C11 реализации разрешено определять ( §6.10.8.3 Макросы условных объектов ):

__STDC_NO_VLA__ Целочисленная константа 1, предназначенная для указания того, что реализация не поддерживает массивы переменной длины или переменно модифицированные типы.

Я не заметил нигде в стандарте, который предусматривает, что структура с FAM является изменяемым типом, поэтому я думаю, что даже без поддержки VLA компилятор C11 необходим для поддержки FAM. Один пункт в пользу этой интерпретации: размер структуры с FAM является фиксированным; FAM не считается частью размера (тогда как размер VLA не является константой времени компиляции).

Ответы [ 2 ]

0 голосов
/ 01 июля 2018

Что касается очевидного, в стандарте не говорится, что FAM являются необязательными, поэтому FAM не являются обязательными.

Однако, чтобы пойти дальше, очень маловероятно, что комитет по стандартизации попытается принять реализации, которые не поддерживают FAM. По сравнению с VLA, добавление поддержки гибких массивов тривиально - немного подправить синтаксический анализатор, позволить последнему члену структуры быть массивом нулевого размера и назвать его днем. VLA требуют более статичного статического анализа и потенциально могут быть обременительными или невозможными для реализации в некоторых крошечных автономных архитектурах.

0 голосов
/ 01 июля 2018

Гибкая поддержка элементов массива должна быть независимой от поддержки VLA. Фактически, можно использовать гибкие элементы массива до того, как стандарт C99 дал им имя, объявив массив нулевой длины в конце struct.

По сути, единственное, что вам нужно сделать для поддержки гибкого члена массива, это изменить компилятор для поддержки синтаксиса flexible[].

Напротив, поддержка VLA требует гораздо больше усилий:

  • Автоматическое распределение больше не может выполняться во время компиляции
  • sizeof оператор должен быть изменен для поддержки оценки во время выполнения
  • Для сохранения размера доступного массива должна быть разработана специальная структура

Эти точки реализации могут быть достаточно сложными, чтобы разработчик компилятора решил не реализовывать VLA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...