如果你调用一个参数太少的函数并且编译器没有抱怨,那么你做错了。
您可以编写一个不指定它需要多少个参数的函数声明/定义:
void func();
/* ... */
func();
func(arg1);
func(arg1, arg2);
Run Code Online (Sandbox Code Playgroud)
所有这三个调用都将被编译器接受,但其中至少有两个是不正确的。
自 1989 年 ANSI C 标准以来,这种形式的函数声明/定义已经过时。
切勿使用此表格。
函数声明应始终编写为原型,即指定参数数量和类型的声明。作为一种特殊情况,(void)表示一个没有参数的函数。
void func(int arg);
/* ... */
func(); /* rejected by compiler */
func(arg1); /* accepted -- but only if arg1 is of type int or convertible to int */
func(arg1, arg2); /* rejected by compiler */
Run Code Online (Sandbox Code Playgroud)
如果您设法编写的代码调用带有不正确数量参数的函数并使其通过编译器,则行为是未定义的。它可能看起来“有效”,但当您使用不同的编译器或相同的编译器和不同的选项编译它时,它可能会在您面前炸毁。
一个复杂因素:一些函数是可变参数的,采用可变数量的参数。最常见的例子是printf. 对于可变参数函数,所需的参数通常由函数的文档指定——并且正确获取参数同样重要。不同之处在于,对于可变参数函数,您的编译器不一定会告诉您调用不正确。
的, ...语法(在函数声明)和定义的宏<stdarg.h>是只受到充分的参数的变量数目和类型(多个)写入和使用C函数合法的方式。
C++ 与普通 C 的区别之一是它包含名称修改,它允许您指定具有不同返回类型和参数的单个函数。两个具有相同名称但具有不同参数的函数:
int foo();
int foo(int param1, char* param2);
Run Code Online (Sandbox Code Playgroud)
可以在 C++ 中完成,因为它实际上在编译时在幕后更改了函数的名称。当您想要传递不同数量的参数时,本质上与调用两个不同的函数名称相同:
int foo1();
int foo2(int param1, char* param2);
Run Code Online (Sandbox Code Playgroud)
当您传递的参数少于预期时,某些编译器至少应该抛出警告;其他人甚至根本不会编译该程序。
假设您将 2 个参数传递给需要 3 个参数的函数。当您尝试在函数中引用第三个参数时,您期望该值是多少?大多数时候,它将是一个垃圾值,并且绝对是您的函数所不期望的。
我建议只向这样的函数传递一个虚拟值: aNULL代表指针,或者 a0或负“未初始化”类型的值代表其他类型。您至少可以在函数中测试这些值。或者只编写第二个带有不同数量参数的函数。