这是我尝试开始通常不会遇到的GCC特殊功能的集合。这是在@jlebedev之后提到的另一个问题,即g ++的“Effective C ++”选项,
-Weffc ++ 这个选项警告C ++代码,这违反了Scott Meyers的“Effective C ++”和“More Effective C ++”一书中给出的一些编程指南。例如,如果使用动态分配的内存的类没有定义复制构造函数和赋值运算符,则会给出警告。请注意,标准库头文件不遵循这些准则,因此您可能希望使用此选项作为对您自己的代码中可能出现的问题的偶然测试,而不是一直使用它进行编译。
还有哪些很酷的功能?
答案 0 :(得分:5)
我会不时地浏览当前的GCC / G ++命令行参数文档并更新我的编译器脚本,以便对任何类型的编码错误更加偏执。 Here it is如果您有兴趣。
不幸的是我没有记录它们所以我忘记了最多,但是 - -pedantic,-Wall,-Wextra,-Weffc ++,-Wshadow,-Wnon-virtual-dtor,-Wold-style-cast,-Woverloaded-virtual,还有一些总是有用的,警告我潜在的危险情况。我喜欢这种可自定义的方面,它迫使我编写干净,正确的代码。它很适合我。
然而,他们并非没有头痛,特别是-Weffc ++。举几个例子:
Final<T>
类(如果T实际上是从T派生的,它会阻止T的子类化)必须将T包装在一个私有包装类中,以声明它为朋友,因为标准平坦禁止与模板参数建立联系。 / LI>
这可能听起来有点受虐狂,但总的来说,这些非常酷的功能增加了我对C ++和一般编程的理解。
G ++还有哪些其他很酷的功能?嗯,它是免费的,开放的,它是最广泛使用的现代编译器之一,始终优于其竞争对手,几乎可以吃任何人投入它,几乎在每个平台上都可用,可定制到地狱,不断改进,拥有广泛的社区 - 什么不喜欢?
答案 1 :(得分:1)
如果遵循代码路径并且没有“返回值”语句结束函数,则返回值的函数(例如int)将返回随机值。不注意这可能导致异常和超出范围的内存写入或读取。
例如,如果使用函数获取数组的索引,并且使用了错误的代码路径(不以返回'value'语句结束的那个),那么将返回一个随机值太大了作为数组的索引,导致各种各样的麻烦,因为你错误地搞乱了堆栈或堆。