编辑:实际上这是这个问题的重复 - 为什么没有参数的函数(与实际函数定义相比)编译?
我是 C 的初学者,虽然我了解函数原型和默认参数提升机制的需求。我还在 SO 上阅读了有关此主题的几篇文章。
我仍然对这个简化片段的警告和最终结果感到困惑。
#include <stdio.h>
void impl();
int main(void)
{
impl(3.0);
return 0;
}
void impl(val)
{
printf("%.2f", val);
}
我收到以下警告:format specifies type 'double' but the argument has type 'int' [-Wformat]
对于这一行printf("%.2f", val);
我不明白为什么编译器val
应该将其视为int
而不是执行默认参数提升。我还读到,如果您不提供参数类型:
ANSI C 编译器将假定您已决定放弃函数原型,并且它不会检查参数。
打印到控制台的结果是0.00
,但据我了解,调用者会将 double 放在堆栈上,%f
也意味着 double inprintf
因此它会从堆栈中读取 double ,结果不应该受到影响。虽然这个问题C Function with parameter without type indicator 仍然有效?解释了一些位,到最后我还是不明白这个问题。我也找不到在哪里声明没有类型的参数应该被编译器视为 type int
。
我认为我不明白标准中写的这部分6.5.2.2“函数调用”:
如果表示被调用函数的表达式的类型不包含原型,则对每个参数执行整数提升,而浮点类型的参数将提升为双精度。这些称为默认参数提升。
在 Windows 10 下编译clang 6.0
并--std=c89
标记。