7

我知道 VLA 不是 C++11 的一部分,而且我已经看到 GCC 的这种失误。这是我切换到 Clang 的部分原因。但现在我也看到了 Clang。我正在使用 clang 3.2(落后于最新版本)并且正在使用 -pedantic 和 -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;
}
4

3 回答 3

6

是的,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.

于 2013-07-15T09:30:37.303 回答
0

只需将您发布到 IDEone 的片段插入,而不将数组声明放入函数中,我得到

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

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

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

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

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

所以这是相当确定的。

于 2013-07-15T02:10:57.013 回答
0

使用这些选项:

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

这适用于 clang 和 gcc 编译器。

于 2019-06-12T08:57:33.030 回答