在我的C ++程序中,我做了:
std::cin >> my_int;
my_class my_array[my_int];
当我在OSX上用g++
编译它时,我得到:
错误:非POD元素类型的可变长度数组
正如所料。但是,当我在Ubuntu上编译它时,我没有得到任何错误。在这两种情况下,我都没有选项进行编译。
作为参考,OSX输出上的g++ --version
:
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix
在Ubuntu上输出:
g++ (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3
Copyright (C) 2009 Free Software Foundation, Inc.
关于为什么我没有收到错误的任何想法?
PS:我试过了apt-get update
和apt-get install g++
但是出于某种原因,我得到的回复是我有最新版本,如果我没记错的话是4.9.0,我没有...
答案 0 :(得分:3)
需要任何符合ISO C ++编译器的错误发布诊断。更确切地说,它需要为违反ISO标准中给出的某些规则的任何程序发出至少一条诊断消息。
g++
默认情况下不是完全符合C ++的编译器。
要使其(尝试)符合C ++标准,请使用-pedantic
选项,最好使用一个选项来指定C ++标准的版本。
例如,当我编译类似于你的程序的东西时,g ++默认不提供任何警告 - 但是当我用
编译它时g++ -pedantic
或
g++ -std=c++11 -pedantic`
我明白了:
c.cpp: In function ‘int main()’:
c.cpp:5:24: warning: ISO C++ forbids variable length array ‘my_array’ [-Wvla]
有关g ++与C ++标准一致性的更多信息,请参阅手册;输入info g++
并阅读"Standards"和"C++ Extensions"部分(链接指向该手册的在线版本)。
答案 1 :(得分:0)
GCC支持一些非标准扩展,其中一个是某些非POD类型的可变长度数组。
另一方面,Clang努力提高标准。GCC和C99允许在运行时确定数组的大小。这个 标准C ++中不允许扩展。但是,Clang支持 这种可变长度数组在非常有限的情况下 与GNU C和C99程序的兼容性:
- 可变长度数组的元素类型必须是POD(“普通旧数据”)类型,这意味着它不能具有任何用户声明的 构造函数或析构函数,任何基类或任何成员 非POD类型。所有C类型都是POD类型。
- 可变长度数组不能用作非类型模板参数的类型。
正如@Brian指出的那样,你在你的OSX机器上使用Clang(毫不奇怪,Apple创建了LLVM)和你的Ubuntu盒子上的GCC。