Вопрос по variable-length-array, c++, memory, gcc, g++ – Недокументированное расширение GCC: VLA в структуре

10

Читая документацию Clang, я натолкнулся на следующую интригующую новость:[1]

clang does not support the gcc extension that allows variable-length arrays in structures. This is for a few reasons: one, it is tricky to implement, two, the extension is completely undocumented, and three, the extension appears to be rarely used. Note that clang does support flexible array members (arrays with a zero or unspecified size at the end of a structure).

Как можно использовать это расширение? Насколько я понимаю, использование alloca в конструкторе приводит к тому, что указатель стека восстанавливается в конце вызывающей функции, которая в этом случае будет конструктором, а не в конце вмещающей структуры.

Спасибо за помощь!

@ forever Нет, это пример элемента гибкого массива C99. void-pointer
Тотis странно.ideone.com/qnghE Robᵩ
@Rob _ {\ psi} Хм, я надеялся, что смогу использовать расширение вне области действия функции (например, в распределителе), чтобы вмещающая структура могла фактически иметь указатель на ресурс. Если это единственный способ использовать расширение, это как бы разрушает мои амбиции = ( void-pointer
@ user315052, C также не поддерживает VLA в качестве членов структуры, так какова семантика C? C поддерживает «гибкие элементы массива» (6.7.2.1), которые не совпадают. Jonathan Wakely
Я думаю, что вы должны смотреть наstackoverflow.com/questions/1558025/… ForEveR

Ваш Ответ

1   ответ
7
@osgx это не про"confessing the existence of a problem"ошибка сообщена разработчиком GCC, поэтому проблема была "признана" в 2008 году. Как показывает ваша ссылка, странное расширение использовалось в реальном мире, поэтому просто удалить его поддержку сложно.
PR 37428 от 2008-09 был исправлен в gcc 4.9 в 2014-03-26 Мареком Полачеком из RedHat с коммитомgithub.com/gcc-mirror/gcc/commit/… (svn 208836, PR c / 37428) с добавлением одного предложения и одного примера к "6.19 Массивам переменной длины";gcc.gnu.org/onlinedocs/gcc-4.9.0/gcc/Variable-Length.html: & quot; В качестве расширения GCC принимает массивы переменной длины в качестве члена структуры или объединения.void foo(int n) { struct S { int x[n]; }; }& Quot ;. 6 лет, чтобы признаться в наличии проблемы:thelinuxjedi.blogspot.com/2014/02/why-vlais-is-bad.html

Похожие вопросы