可变长度数组也是Clang中的一个扩展吗
Are variable length arrays an extension in Clang too?
我知道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
。
使用这些选项:
-Wvla
警告vla使用-Werror=vla
认为vla是一个错误
这在clang和gcc编译器中都有效。
只需将您发布的代码片段插入IDEone,而无需将数组声明放入函数中,就可以获得
prog.cpp:12:39:错误:数组绑定不是']'标记之前的整数常量
正如您所观察到的,在它周围添加main()
函数会获得成功。
由于C++11不允许在main
中合法的数组声明,但不允许在命名空间范围中合法,而且这是VLA的一个属性,因此可以合理地得出这样的结论。
更新:Coliru.org提供,Clang的消息是
main.cpp:12:9:错误:文件范围中不允许使用可变长度数组声明
所以这是相当确定的。
相关文章:
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 我想通过带有C++和Python的插件创建一个可扩展的应用程序
- 如何构建一个 setup.py 来编译C++使用 Python、pybind11 和 Mingw-w64 的扩展?
- 为什么 MSVC C++编译器将一个简单的 Hello World 扩展为 4000 行汇编?
- 在另一个字符串中插入文件扩展名之前的字符串
- 如何将一个 QQuickItem 扩展作为子扩展添加到另一个 QQuickItem 扩展?
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- RXCPP:创建一个不关心可观察量输入类型的扩展
- 是否可以在不扩展初始宏的情况下将一个宏作为参数提供给另一个宏?
- 用一个额外的元素扩展 std::array 的每个 std::元组
- 如何使用直接IO编写一个带有扩展文件大小的小文件
- 如何将矢量大小扩展一个元素并用变量填充它
- 设计一个扩展良好的多线程应用程序
- 通过在上一个数组结束后立即存储下一个元素来扩展数组
- 为什么我不能在 c++ 类中声明一个空构造函数,该构造函数从一个具有私有构造函数的构造函数扩展而来
- Qt多个文件过滤器,强制一个扩展名
- GLEW只是一个扩展库,或者它也包含OpenGL ES 2.0实现
- 可变长度数组也是Clang中的一个扩展吗
- 如何为Internet Explorer创建一个扩展作为Exe-Com服务器
- 写入一个扩展名不同但名称与所读文件相同的文件