GCC隐藏/鲜为人知的功能

Any*_*orn 7 gcc

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

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

还有哪些很酷的功能?

Fri*_*igo 5

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

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

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

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

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

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


Orc*_*rca 1

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

例如,如果使用函数来获取数组的索引,并且使用了错误的代码路径(不以 return 'value' 语句结尾的代码路径),则将返回一个可能太大的随机值作为数组的索引,当您错误地弄乱堆栈或堆时,会导致各种令人头痛的问题。