我一直致力于一个包含以下性质代码的程序。
printf("%lld",somelonglongint)
然而,我正在开发一个sparc平台,其中long long是64位,int和long int在32位构建时甚至是32位。如果错误地将一行代码写入了
printf("%d",somelonglongint)
即使使用-Wall也没有编译器警告,没有,但是这段代码会导致程序无意义打印,或者经常导致程序出错。是否有任何方法迫使gcc至少警告这一点,最好是错误,因为结果是灾难性的
答案 0 :(得分:3)
当未定义的行为发挥作用时,就会发生这种情况。使用错误的说明符调用UB。
如果转换规范无效,则行为未定义。 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禁用。