我正在使用gcc(Ubuntu 4.8.4-2ubuntu1~14.04.3)4.8.4并编译以下代码:
void main()
{
float f= 10.0;
char *str = "hello";
printf("f=%.1f str=%s\n",str, f);
}
编译器显示预期的警告:
prac.c: In function 'main':
prac.c:8:1: warning: format '%f' expects argument of type 'double', but argument 2 has type 'char *' [-Wformat=]
printf("f=%.1f str=%s\n",str, f);
^
prac.c:8:1: warning: format '%s' expects argument of type 'char *', but argument 3 has type 'double' [-Wformat=]
但是,在执行此程序时,输出会自动更正。
# ./a.out
f=10.0 str=hello
这是怎么回事。 编译器的哪个功能正在执行此操作。 任何方法都可以禁用此自动更正。
答案 0 :(得分:4)
这不是“自动纠正”,而是“未定义的行为”。这种情况正在发生,因为浮点变量可能(或可能不是!)传递给单独空间中的函数而不是整数类型。因此,当您传递一个指针(或int)和一个double时,它们仍然使用每种类型的第一个槽,即使您以错误的顺序指定它们。
使用-Wformat=2
和-Werror
进行编译,您再也不会看到此问题,因为GCC(和Clang)将拒绝构建此类代码。