GCC编译C++代码时-Wall未提示自赋值及未使用变量怎么办
现象原因
- 语法合法性问题:C++标准规定,变量声明时,变量名在声明符完成后立刻进入作用域。因此在
const std::string a = a + "bar";这行代码中,等号右侧的a会被解析为当前正在声明的变量,而非其他作用域的同名变量,语法层面是合法的,编译器不会直接报错。 - 未初始化使用告警未触发:
-Wall默认仅对基础数据类型(如int、char等)的未初始化使用触发告警,std::string是自定义类类型,GCC默认仅在开启优化等级时才会对类对象的数据流进行深度分析,低优化等级下无法识别到a在构造完成前就被调用operator+的问题。 - 未使用变量告警未触发:匿名命名空间下的const全局变量默认是内部链接属性,
-Wall默认仅对局部变量、函数参数的未使用场景触发告警,不会检查内部链接的const全局变量的使用情况。
需添加的编译参数
- 开启
-O1及以上优化等级:只有开启优化时GCC才会执行数据流分析,才能识别到类对象的未初始化使用问题 - 添加
-Winit-self:专门用于检测变量初始化时引用自身的场景,对类类型也生效,是这类笔误最直接的检测选项 - 添加
-Wextra或细分的-Wunused-const-variable:开启对未使用const全局变量的检查,触发变量b未使用的告警
推荐开发阶段使用的完整编译参数组合:-std=c++17 -Wall -Wextra -O1 -Wuninitialized -Winit-self
使用该组合编译测试代码时,GCC 9.3会同时输出a未初始化就使用、b未被使用的两类告警。
内容的提问来源于stack exchange,提问作者Paul Grinberg
相关产品推荐
相关产品推荐

