g ++不会产生错误,例如: "错误:非POD元素类型的可变长度数组"

时间:2014-07-14 23:49:43

标签: c++ macos ubuntu g++

在我的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 updateapt-get install g++但是出于某种原因,我得到的回复是我有最新版本,如果我没记错的话是4.9.0,我没有...

2 个答案:

答案 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努力提高标准。

来自Clang compatibility FAQ

  

GCC和C99允许在运行时确定数组的大小。这个   标准C ++中不允许扩展。但是,Clang支持   这种可变长度数组在非常有限的情况下   与GNU C和C99程序的兼容性:

     
      
  • 可变长度数组的元素类型必须是POD(“普通旧数据”)类型,这意味着它不能具有任何用户声明的   构造函数或析构函数,任何基类或任何成员   非POD类型。所有C类型都是POD类型。
  •   
  • 可变长度数组不能用作非类型模板参数的类型。
  •   

正如@Brian指出的那样,你在你的OSX机器上使用Clang(毫不奇怪,Apple创建了LLVM)和你的Ubuntu盒子上的GCC。