C++11是否支持变长数组?为何XCode 11编译相关代码可运行?
C++11是否支持变长数组?你的Xcode运行成功的原因解析
首先明确结论:C++11标准本身完全不支持变长数组(VLA),你在Xcode 11中能运行这段代码,是因为使用的Clang编译器提供了非标准的扩展特性。
一、标准C++的硬性要求
不管是C11还是后续的C17、C20,官方标准都明确规定:数组的大小必须是编译期就能确定的常量表达式。你代码里的arrayS是运行时通过用户输入获取的变量,完全不符合标准要求,所以这段代码在严格遵循C标准的编译器下会直接编译报错。
二、Xcode能运行的底层原因
Xcode默认使用的Clang编译器(和GCC类似)支持C99标准中的变长数组特性作为扩展功能——即使在编译C代码时,也允许这种非标准写法。这是编译器厂商为了兼容C代码、给开发者提供临时便利而额外添加的功能,不属于C标准的一部分。
三、给朋友发送代码的注意事项
如果你的朋友使用以下编译器/环境,这段代码大概率无法编译:
- MSVC(Visual Studio默认编译器,完全不支持VLA扩展)
- 开启了
-pedantic(严格遵循标准)编译选项的Clang/GCC
所以更稳妥的做法是改用标准C++的动态数组实现,最推荐使用std::vector,修改后的代码如下:
#include <iostream> #include <vector> using namespace std; int main(int argc, const char * argv[]) { unsigned long arrayS; cin >> arrayS; vector<bool> a(arrayS); // 标准C++动态数组,所有合规编译器都支持 // 验证元素数量:直接用a.size()即可,这是标准方法 cout << "数组元素数量:" << a.size() << endl; return 0; }
另外你用*(&a + 1) - a来验证元素数量的方式,也是依赖编译器扩展的非标准行为,标准C++中并没有定义这种操作的结果,所以不推荐在跨编译器场景下使用。
内容的提问来源于stack exchange,提问作者Ryan Zhang
相关产品推荐
相关产品推荐

