热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

我怎样才能让gcc警告我"inti=i;"

如何解决《我怎样才能让gcc警告我"inti=i;"》经验,为你挑选了1个好方法。



1> rici..:

对于GCC编译C程序,您需要添加编译器标志-Winit-self.(你还需要-Wall或者-Wuninitialized,见下文.)对于GCC编译C++程序,这个标志是隐含的,-Wall但对于C,它需要明确指定; 它不属于-Wextra任何一部分.

对于Clang来说,情况稍微有点儿了.在OP的片段中,Clang不会产生任何诊断.但是,使用下面GCC手册中提供的略有不同的片段,提供了诊断:

int f() {
  int i = i;
  return i;
}

不同之处在于,在上面的片段中,i实际使用了(未初始化的)值.显然,在原始代码中,Clang检测到变量是无用的,并在应用诊断之前将其作为死代码消除.

在Clang中,诊断由触发-Wuninitialized,由-WallGCC 启用.


以下是GCC手册的摘录:

-Winit-self (仅限C,C++,Objective-C和Objective-C++)

警告用自己初始化的未初始化变量.请注意,此选项只能与-Wuninitialized选项一起使用.

例如,GCC警告i只有在-Winit-self指定时才会在以下代码段中未初始化:

        int f()
          {
            int i = i;
            return i;
          }

-Wall在C++中启用此警告.

如摘录所示,-Wuninitialized也是必需的.在C和C++中,-Wall暗示着-Wuninitialized.但请注意,除非还要求某些优化级别,否则将无法检测到许多未初始化的用途.(-Winit-self据我所知,这不适用.可以在没有优化的情况下检测到.)


令人恼火的是,当您将问题标记为重复时,先前标记的重复项将消失.我没有标记它,因为没有一个重复实际上回答了正文中的问题; 我还编辑了标题.

作为参考,这里是原始的重复,可能是有意义的:

为什么编译器允许自己初始化变量?

gcc没有警告未初始化的变量

为什么c ++编译器接受这个初始化?static int x = x;

在C++ 14中,C++标准是否在使用不确定值和未定义行为方面发生了变化?


推荐阅读
author-avatar
Maugham
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有