尽管函数调用的参数数量不正确,但 C 程序仍在编译

C Program compiling despite incorrect number of arguments to function call

遇到一个C程序如下:

#include <stdio.h>

int sum1(); //line A

int main()
{
    int a = 2;
    int b = 3;

    int sum = sum1(a, b);  //line B
    printf("Sum: %d\n", sum);
}

int sum1(int a, int b, int c) //line C
{
    int sum = a + b + c;
    printf("%d %d %d\n", a, b, c);
    return sum;
}

我很惊讶地看到程序编译(gcc 版本 7.5.0)并给出以下输出:

2 3 3
Sum: 8

我可以在这段代码中看到 2 个错误:

  1. 函数声明(A 行)中的参数数量与函数定义(C 行)中的参数数量不同
  2. 函数调用(B 行)未指定函数定义(C 行)中所需的所有 3 个参数。

用 C++(使用 g++)编译程序,确实指出了我提到的 2 个错误。

我无法理解 C 是如何能够忽略此类错误的,但我无法找到与此相关的任何文档。任何有助于理解这一点的帮助将不胜感激。

这不是错误,但如果您打开它们,编译器肯定会发出 警告。打开所有编译器警告并密切注意它们通常是个好主意。

具有不同数量和类型参数的函数是合法的,并且在 C 中很常见,如果声明正确,可以在没有警告的情况下创建。

int sum1(); forward 声明了一个参数数量和类型未知的函数,这与您对函数的定义不冲突。

然而,下面将向前声明一个函数,该函数不采用 任何 参数, 与您的定义冲突并且很可能导致编译错误:

int sum1(void); //line A

第二个问题是,当函数需要 3 个参数时,您使用 2 个参数调用 sum1(并且您将其声明为一个接受未知数量参数的函数)。然后该函数将从堆栈中选择 int 个字节(最有可能)并使用它。这会破坏堆栈并使您的程序具有 未定义的行为