编译器警告在printf中混合long long int和int

时间:2015-03-19 16:08:32

标签: c gcc sparc

我一直致力于一个包含以下性质代码的程序。

printf("%lld",somelonglongint)

然而,我正在开发一个sparc平台,其中long long是64位,int和long int在32位构建时甚至是32位。如果错误地将一行代码写入了

printf("%d",somelonglongint)

即使使用-Wall也没有编译器警告,没有,但是这段代码会导致程序无意义打印,或者经常导致程序出错。是否有任何方法迫使gcc至少警告这一点,最好是错误,因为结果是灾难性的

2 个答案:

答案 0 :(得分:3)

当未定义的行为发挥作用时,就会发生这种情况。使用错误的说明符调用UB。

C11:7.21.6.1:

  

如果转换规范无效,则行为未定义 282)如果任何参数不是相应转换规范的正确类型,则行为未定义。

使用标记-Wall编译它,GCC给我警告

[Warning] format '%d' expects argument of type 'int', but argument 2 has type 'long long int' [-Wformat=]   

在Ubuntu 14.04上编译时没有-Wall

haccks@haccksbuntu:~/Desktop$ gcc test.c
test.c: In function ‘main’:
test.c:66:2: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long long int’ [-Wformat=]
printf("%d\n", somelonglongint);
^

答案 1 :(得分:1)

来自man gcc

  

-Wformat

     

检查" printf"和" scanf"等,以确保提供的参数具有类型              适合指定的格式字符串,以及格式中指定的转换              字符串有意义。这包括标准功能,以及格式属性指定的其他功能,              在" printf"," scanf"," strftime"和" strfmon" (X / Open扩展,不在C标准中)              家庭(或其他针对特定目标的家庭)。没有格式检查哪些功能              已指定的属性取决于所选的标准版本,以及此类检查              没有指定属性的函数被-ffreestanding或-fno-builtin禁用。