可变长度数组也是Clang中的一个扩展吗

Are variable length arrays an extension in Clang too?

本文关键字:一个 扩展 数组 Clang      更新时间:2023-10-16

我知道VLA不是C++11的一部分,我已经看到GCC的这一失误。这也是我转投Clang的部分原因。但现在我也看到了Clang。我正在使用clang 3.2(落后于最新版本),并且我正在使用-迂腐和-std=c++11

我希望我的测试还没有编译,它已经编译并运行了。

int myArray[ func_returning_random_int_definitely_not_constexpr( ) ];

这是编译器错误还是我遗漏了什么?

作为对评论的回应,这里是random_int_function()

#include <random>
int random_int_function(int i) 
{
    std::default_random_engine generator;
    std::uniform_int_distribution<int> distribution(1,100);
    int random_int = distribution(generator);  
    return i + random_int;
}

是的,clang 3.2/3.3中支持可变长度数组,与C++11标准(§8.3.4/1)。

正如你所说,一个程序,比如:

#include <random>
int random_int_function(int i) 
{
    std::default_random_engine generator;
    std::uniform_int_distribution<int> distribution(1,100);
    int random_int = distribution(generator);  
    return i + random_int;
}
int main() {
    int myArray[ random_int_function( 0 ) ];
    (void)myArray;
    return 0;
}

编译并运行。但是,对于选项-pedantic; -std=c++11你说你通过了,clang 3.2/3.3诊断:

警告:可变长度阵列是C99的一项功能[-Wvla]

该行为与gcc(4.7.2/4.8.1)的行为相匹配,后者更强调地警告:

警告:ISO C++禁止可变长度数组"myArray"[-Wvla]

若要使诊断成为错误,请为任一编译器传递-Werror=vla

使用这些选项:

  1. -Wvla警告vla使用
  2. -Werror=vla认为vla是一个错误

这在clang和gcc编译器中都有效。

只需将您发布的代码片段插入IDEone,而无需将数组声明放入函数中,就可以获得

prog.cpp:12:39:错误:数组绑定不是']'标记之前的整数常量

正如您所观察到的,在它周围添加main()函数会获得成功。

由于C++11不允许在main中合法的数组声明,但不允许在命名空间范围中合法,而且这是VLA的一个属性,因此可以合理地得出这样的结论。

更新:Coliru.org提供,Clang的消息是

main.cpp:12:9:错误:文件范围中不允许使用可变长度数组声明

所以这是相当确定的。

相关文章: