调用C中参数较少的函数的后果?

时间:2014-05-23 16:03:24

标签: c function arguments call

我编写了一个函数,它接受一些参数和一个指针参数。在调用函数时,有时我需要传递指针以便在函数内部使用,有时我不需要。 调用参数较少的函数会产生什么后果?它正确编译并在运行时仍然很好,但这是一个很好的编程?如果我用虚拟变量调用函数会更好吗? 谢谢,对不起初学者的问题。

3 个答案:

答案 0 :(得分:2)

如果你调用参数太少的函数并且编译器没有抱怨,那么你做错了。

可以编写一个函数声明/定义,但不指定它需要多少个参数:

void func();
/* ... */
func();
func(arg1);
func(arg1, arg2);

编译器将接受所有这三个调用,但其中至少有两个是不正确的。

自1989年ANSI C标准以来,这种形式的功能声明/定义已 obsolescent

永远不要使用此表单。

函数声明应始终写为 prototypes ,即声明指定参数的数量和类型。作为一种特殊情况,(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 */

如果您设法编写调用具有错误参数数量的函数的代码并将其通过编译器,则行为未定义。它可能看似“工作”,但是当你用不同的编译器或者使用相同的编译器和不同的选项编译它时,它可能会爆炸。

一个复杂因素:一些函数是 variadic ,采用可变数量的参数。最常见的例子是printf。对于可变参数函数,所需的参数通常由函数的文档指定 - 并且正确地获取参数同样重要。不同之处在于,对于可变参数函数,编译器不一定会告诉您调用不正确。

, ...语法(在函数声明中)和<stdarg.h>中定义的宏是唯一合法的方式来编写和使用带有变量数的C函数论证的类型。

答案 1 :(得分:1)

C ++与普通C的不同之处在于它包含了 name mangling ,它允许您指定具有不同返回类型和参数的单个函数。两个共享相同名称但具有不同参数的函数:

int foo();
int foo(int param1, char* param2);

可以在C ++中完成,因为它实际上在编译时会改变幕后函数的名称。当你想传入不同数量的参数时,它与它所调用的两个不同的函数名称基本相同:

int foo1();
int foo2(int param1, char* param2);

当传入的参数少于预期时,一些编译器至少应该发出警告;其他人甚至根本没有编译该程序。

让我们假设您将2个参数传递给期望为3的函数。当您尝试在函数中引用第3个参数时,您期望该值是什么?大多数情况下,它将是一个垃圾值,绝对是你的功能所不具备的。

我建议只是将虚拟值传递给这样的函数:指针NULL0或否定&#34;未初始化&#34;其他类型的价值。您至少可以在函数中测试这些值。或者只写一个带有不同数量参数的第二个函数。

答案 2 :(得分:1)

我不会这样做。我只会用声明的参数数量来调用函数。

这对代码的读者来说非常困惑。

代码的读者甚至可能认为函数已经过载并且看起来 对于具有较少参数的函数的其他定义。

省略的参数可以具有任何值 - C编译器将任何内容视为合法行为。该程序可以在测试环境中完美运行,然后因任何原因或无理由而崩溃。

如果我绝对必须拥有可变数量的参数,出于合法目的,我会尝试将参数放在列表中而不是使用可变数量的参数。如果其他人要求我使用变量参数,我会使用varargs而不是默认行为,然后仅在所有参数都是相同类型的情况下。