0

编辑:实际上这是这个问题的重复 - 为什么没有参数的函数(与实际函数定义相比)编译?

我是 C 的初学者,虽然我了解函数原型和默认参数提升机制的需求。我还在 SO 上阅读了有关此主题的几篇文章。

  1. C 函数调用中的默认参数提升
  2. C 原型函数

我仍然对这个简化片段的警告和最终结果感到困惑。

#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标记。

4

1 回答 1

1

这个:

void impl(val)

没有指定val参数的正式类型。这使其默认为int. 这与在运行时传递给函数的类型无关,如果函数从未被调用,这同样适用。

我认为,省略类型也很老派,在现代 C 中不受支持。

于 2018-01-17T10:00:03.210 回答