GCC隐藏/鲜为人知的功能

时间:2011-02-18 04:57:49

标签: gcc

这是我尝试开始通常不会遇到的GCC特殊功能的集合。这是在@jlebedev之后提到的另一个问题,即g ++的“Effective C ++”选项,

  

-Weffc ++       这个选项警告C ++代码,这违反了Scott Meyers的“Effective C ++”和“More Effective C ++”一书中给出的一些编程指南。例如,如果使用动态分配的内存的类没有定义复制构造函数和赋值运算符,则会给出警告。请注意,标准库头文件不遵循这些准则,因此您可能希望使用此选项作为对您自己的代码中可能出现的问题的偶然测试,而不是一直使用它进行编译。

还有哪些很酷的功能?

2 个答案:

答案 0 :(得分:5)

我会不时地浏览当前的GCC / G ++命令行参数文档并更新我的编译器脚本,以便对任何类型的编码错误更加偏执。 Here it is如果您有兴趣。

不幸的是我没有记录它们所以我忘记了最多,但是 - -pedantic,-Wall,-Wextra,-Weffc ++,-Wshadow,-Wnon-virtual-dtor,-Wold-style-cast,-Woverloaded-virtual,还有一些总是有用的,警告我潜在的危险情况。我喜欢这种可自定义的方面,它迫使我编写干净,正确的代码。它很适合我。

然而,他们并非没有头痛,特别是-Weffc ++。举几个例子:

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

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

G ++还有哪些其他很酷的功能?嗯,它是免费的,开放的,它是最广泛使用的现代编译器之一,始终优于其竞争对手,几乎可以吃任何人投入它,几乎在每个平台上都可用,可定制到地狱,不断改进,拥有广泛的社区 - 什么不喜欢?

答案 1 :(得分:1)

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

例如,如果使用函数获取数组的索引,并且使用了错误的代码路径(不以返回'value'语句结束的那个),那么将返回一个随机值太大了作为数组的索引,导致各种各样的麻烦,因为你错误地搞乱了堆栈或堆。