编辑:实际上这个问题是重复的 - Why does a function with no parameters (compared to the actual function definition) compile?
我是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
,但据我所知,调用者会在堆栈上放置双倍而%f
也意味着加倍{{1}所以它读取堆栈的两倍,结果不应该受到影响。虽然这个问题C Function with parameter without type indicator still works?解释了一些问题,但我仍然不明白这个问题。此外,我无法找到说明没有类型的参数应被编译器视为类型printf
的位置。
我认为我不理解这部分 6.5.2.2&#34;函数调用&#34; 写在标准中:
如果表示被调用函数的表达式具有不包含原型的类型,则对每个参数执行整数提升,并将类型为float的参数提升为double。这些被称为默认参数促销。
在Windows 10下使用int
和clang 6.0
标记进行编译。
答案 0 :(得分:1)
此:
void impl(val)
没有指定val
参数的正式类型。这使其默认为int
。这与在运行时传递给函数的值无关,如果从未调用该函数,则同样如此。
我认为,省略这种类型是非常老派的,现代C不支持。