未记录的 GCC 扩展:结构中的 VLA
Posted
技术标签:
【中文标题】未记录的 GCC 扩展:结构中的 VLA【英文标题】:Undocumented GCC Extension: VLA in struct 【发布时间】:2012-08-17 00:41:24 【问题描述】:在阅读 Clang 文档时,我发现了以下有趣的花絮:[1]
clang 不支持允许在结构中使用可变长度数组的 gcc 扩展。这有几个原因:第一,实现起来很棘手,第二,扩展完全没有文档记录,第三,扩展似乎很少使用。请注意,clang 确实支持灵活的数组成员(在结构末尾具有零或未指定大小的数组)。
如何使用此扩展程序?我的理解是,在构造函数中使用 alloca 会导致堆栈指针在调用函数的末尾恢复,在这种情况下,调用函数将是构造函数——而不是在封闭结构的末尾。
感谢您的帮助!
【问题讨论】:
这是奇怪的。 ideone.com/qnghE 我觉得你应该看看***.com/questions/1558025/… @forever 不,这是 C99 灵活数组成员的示例。 @Rob_\psi 嗯,我希望能够在函数范围之外使用扩展(例如在分配器中),以便封闭结构实际上可以拥有指向资源。如果这是可以使用扩展的唯一方法,它有点粉碎我的野心=( @user315052,C 也不支持 VLA 作为结构成员,那么 C 的语义是什么? C 支持不一样的“灵活数组成员”(6.7.2.1)。 【参考方案1】:见http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37428
还有http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42121
是的,这很奇怪。
【讨论】:
PR 37428 from 2008-09 在 gcc 4.9 中由 RedHat 的 Marek Polacek 于 2014 年 3 月 26 日修复,提交 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 的一个示例:“作为扩展,GCC 接受可变长度数组作为结构或联合的成员。void foo(int n) struct S int x[n]; ;
”。 6年承认存在问题:thelinuxjedi.blogspot.com/2014/02/why-vlais-is-bad.html
@osgx 这不是关于“承认存在问题”,该错误是由 GCC 开发人员报告的,因此该问题在 2008 年被“承认”。作为您的链接显示,这个奇怪的扩展已经在现实世界中使用,所以简单地删除对它的支持是很困难的。以上是关于未记录的 GCC 扩展:结构中的 VLA的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Chrome 33+ 中通过 GPO 自动安装 Chrome 扩展(Chrome 错误或 GPO 安装的扩展的未记录更改?)
踩坑记录:supervisor 日志返回信息:redis扩展未安装