2011-02-18 93 views
7

这是我尝试启动一个通常不会遇到的GCC特殊功能的集合。这来自中提到的“有效的C++”为-g选项++的另一个问题@jlebedev后,GCC隐藏/鲜为人知的功能

-WeffC++ 此选项发出警告,打破一些在书本“有效的C++”,并给出了编程指南“C++代码更有效的C++“由Scott Meyers撰写。例如,如果使用动态分配内存的类没有定义复制构造函数和赋值运算符,将给出警告。请注意,标准库头文件不遵循这些准则,因此您可能希望将此选项用作偶尔测试自己代码中可能出现的问题,而不是一直进行编译。

还有其他很酷的功能吗?

回答

1

返回值(例如int)的函数将返回一个随机值,如果遵循的代码路径结束函数而没有“返回值”语句。不注意这可能会导致异常和超出范围的内存写入或读取。

例如,如果使用函数来获取数组中的索引,并且使用了错误的代码路径(不以“返回值”语句结束的那个),那么会返回一个随机值可能会像索引到数组那样太大,导致各种令人头疼的问题,因为您错误地弄乱了堆栈或堆。

5

我经常浏览当前的GCC/G ++命令行参数文档,并更新我的编译器脚本,使其更加偏执于任何类型的编码错误。 Here it is如果你有兴趣。

不幸的是,我没有记录它们,所以我忘记了大部分,但是 - 泛型,-Wall,-Wextra,-WeffC++,-Wshadow,-Wnon-virtual-dtor,-Wold-style-cast,-Woverloaded-virtual ,还有其他一些东西总是有用的,告诉我潜在的危险情况。我喜欢这种可定制的方面,它迫使我写出干净,正确的代码。它给了我很好的服务。

然而,他们并非没有头痛,尤其是-WeffC++。举几个例子:

  • 它需要我提供一个自定义的拷贝构造函数和赋值操作符,如果我的类中有指针成员,这是因为我使用垃圾回收而无用。所以我需要声明它们的空私有版本。
  • 我NonInstantiable类(这可以阻止任何的子类的实例),必须实现一个虚拟的私人朋友类,所以G ++不抱怨“只有私有构造函数且没有朋友”
  • Final<T>类(这可以阻止的T子类,如果T实际上是从它派生而来的)不得不将T包装在一个私有包装类中,以将其声明为朋友,因为标准平坦禁止与模板参数友好。
  • G ++识别永不返回返回值的函数,而是抛出一个异常,并声明它们没有用noreturn属性声明。隐藏在真正的指示背后并不奏效,G ++太聪明并且认可了它们。花了我一段时间想出一个变量volatile并将其与它的值进行比较,以便能够毫无阻碍地抛出异常。
  • 浮点比较警告。天啊。我必须通过编写x < = y和x> = y而不是x == y来解决这些问题。
  • 影子虚拟。好的,这对于防止子类中的愚蠢阴影/超载问题显然是有用的,但仍然很烦人。
  • 没有先前的函数声明。只要我开始在其上面拷贝功能声明,就会失去它的重要性。

这可能听起来有点受虐狂,但作为一个整体,这些非常酷的功能增加了我对C++和一般编程的理解。

G ++还有哪些很酷的功能?好吧,它是免费的,开放的,它是最广泛使用的现代编译器之一,它始终胜过其竞争对手,几乎可以吃到任何人投掷的东西,几乎可以在任何平台上使用,可定制到地狱,持续改进,拥有广泛的社区 - 什么是不喜欢?