代码之家  ›  专栏  ›  技术社区  ›  Ree

GCC-将int赋值给char时不应该发出警告吗?

  •  7
  • Ree  · 技术社区  · 15 年前

    我最近在我的笔记本电脑上设置了一个MinGW+MSYS环境,以检查Netbeans C/C++支持的情况。一切似乎都很正常,但是,在测试期间,我注意到GCC和Microsoft的cl.exe编译器之间存在差异。

    下面是一个示例程序:

    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
    
    int main(void) {
        int i_max = INT_MAX;
        char c_max = CHAR_MAX, c;
    
        c = i_max;
        printf("i_max: %d, c_max: %d, c: %d\n", i_max, c_max, c);
        return EXIT_SUCCESS;
    }
    

    输出为:

    i_max: 2147483647, c_max: 127, c: -1
    

    正如您在上面的代码中所看到的,我将int赋值给char。这难道不应该产生一个可能发生数据丢失的警告吗?微软的编译器(我已经配置得非常严格)确实发出了警告,而GCC则没有。

    以下是我使用的GCC选项:

    -g -Werror -ansi -pedantic -Wall -Wextra
    

    我是否遗漏了一些GCC选项,以使编译时检查更加严格?

    6 回复  |  直到 6 年前
        1
  •  9
  •   Christoph    15 年前

    你在找什么

    -Wconversion
    

    您必须向gcc开发人员询问某些警告未包含在其中的具体原因 -Wall -Wextra .

    -Wall -Wextra -Wmissing-prototypes -Wmissing-declarations -Wshadow
    -Wpointer-arith -Wcast-align -Wwrite-strings -Wredundant-decls -Wnested-externs
    -Winline -Wno-long-long -Wconversion -Wstrict-prototypes
    

    正如其他人所指出的那样 -Wconversion 改变 version 4.3 -关于原型强制类型转换的旧警告现在可以作为 -Wtraditional-conversion .

        2
  •  2
  •   ezpz    15 年前

    -Wconversion 任何一个但是,如果你用类似于 splint 您会收到三条警告:

    file.c: (in function main)
    file.c:9:5: Assignment of int to char: c = i_max
      To make char and int types equivalent, use +charint.
    file.c:10:52: Format argument 2 to printf (%d) expects int gets char: c_max
       file.c:10:32: Corresponding format code
    file.c:10:59: Format argument 3 to printf (%d) expects int gets char: c
       file.c:10:39: Corresponding format code
    
    Finished checking --- 3 code warnings
    

    如果你真的想抓住 全部的 错误您应该使用多个工具。

        3
  •  2
  •   AnT stands with Russia    15 年前

    如果你认为 编译器应该在这里发出警告(我似乎在你们的问题中读到了这种情绪),然后。。。“警告”不是强制性的,甚至不是事实上的统一。这里没有“应该”。在C中,将较大类型的整数值分配给较小类型而不显式转换是完全合法的。转换时溢出会产生实现定义的行为(甚至不是UB:)

        4
  •  2
  •   Community CDub    8 年前

    -墙 doesn't quite mean -Wall ,-Wextra已经因为有点过于迂腐而受到批评。

    正如Christoph所说,您正在寻找-Wconversion。深入了解-Wall和-Wextra实际启用的功能是很好的,只需在make文件中指定所需的-W标志,尤其是在将警告视为错误时。

        5
  •  1
  •   Glen    15 年前

    在C语言中,将int赋值给char是合法的。

    由于这是合法的(但可能是狡猾的),不同的编译器供应商在遇到此代码时会做不同的事情。

        6
  •  0
  •   pmg    15 年前

    我认为它属于“常用算术转换”(6.3.1.8)或“整数提升规则”(5.1.2.3(?)),但我找不到具体的文本说明您看到的行为是预期的。