尽管函数调用的参数数量不正确,但 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 个错误:
- 函数声明(A 行)中的参数数量与函数定义(C 行)中的参数数量不同
- 函数调用(B 行)未指定函数定义(C 行)中所需的所有 3 个参数。
用 C++(使用 g++)编译程序,确实指出了我提到的 2 个错误。
我无法理解 C 是如何能够忽略此类错误的,但我无法找到与此相关的任何文档。任何有助于理解这一点的帮助将不胜感激。
这不是错误,但如果您打开它们,编译器肯定会发出 警告。打开所有编译器警告并密切注意它们通常是个好主意。
具有不同数量和类型参数的函数是合法的,并且在 C 中很常见,如果声明正确,可以在没有警告的情况下创建。
int sum1();
forward 声明了一个参数数量和类型未知的函数,这与您对函数的定义不冲突。
然而,下面将向前声明一个函数,该函数不采用 任何 参数,是 与您的定义冲突并且很可能导致编译错误:
int sum1(void); //line A
第二个问题是,当函数需要 3 个参数时,您使用 2 个参数调用 sum1
(并且您将其声明为一个接受未知数量参数的函数)。然后该函数将从堆栈中选择 int
个字节(最有可能)并使用它。这会破坏堆栈并使您的程序具有 未定义的行为。
遇到一个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 个错误:
- 函数声明(A 行)中的参数数量与函数定义(C 行)中的参数数量不同
- 函数调用(B 行)未指定函数定义(C 行)中所需的所有 3 个参数。
用 C++(使用 g++)编译程序,确实指出了我提到的 2 个错误。
我无法理解 C 是如何能够忽略此类错误的,但我无法找到与此相关的任何文档。任何有助于理解这一点的帮助将不胜感激。
这不是错误,但如果您打开它们,编译器肯定会发出 警告。打开所有编译器警告并密切注意它们通常是个好主意。
具有不同数量和类型参数的函数是合法的,并且在 C 中很常见,如果声明正确,可以在没有警告的情况下创建。
int sum1();
forward 声明了一个参数数量和类型未知的函数,这与您对函数的定义不冲突。
然而,下面将向前声明一个函数,该函数不采用 任何 参数,是 与您的定义冲突并且很可能导致编译错误:
int sum1(void); //line A
第二个问题是,当函数需要 3 个参数时,您使用 2 个参数调用 sum1
(并且您将其声明为一个接受未知数量参数的函数)。然后该函数将从堆栈中选择 int
个字节(最有可能)并使用它。这会破坏堆栈并使您的程序具有 未定义的行为。