C中函数调用中的默认参数

时间:2012-02-07 13:02:41

标签: c function parameters default undefined-behavior

让我们在一个文件中说我在同一个项目的两个文件中有一些代码

file1.c
int func1(int a, int b, int c, bool d)
{
        /* function body */
}

file2.c
extern func1(int a, int b, int c);

/* function call */
func1(runtime1, runtime2, runtime3);

从file2.c调用时,bool d的值是什么?我知道这是非常糟糕的做法,但是我维护旧代码并且有人这样做了,我只是想知道默认参数或者它是否依赖于实现。另请注意,此示例中的bool是软件的typedef,因为此特定项目不支持C99。谢谢。!

5 个答案:

答案 0 :(得分:4)

该值不仅取决于实现;程序的整个行为是未定义的。如果您将func1的声明放在标题中而不是file2.c中,并且您在file1.c中包含该标题,那么良好的C语言实践中,编译器将拒绝编译此

在实践中,你可能会发现d有一些任意的,不可预测的值,尽管你的程序也可能会神秘崩溃。

答案 1 :(得分:4)

该值将是未定义的。调用func1时,其参数将进入堆栈。如果用少参数调用它,则堆栈将比进程预期的sizeof(bool)字节短。这不会使您的程序崩溃,因为您的堆栈和堆正在“面对”,但如果您尝试访问d,您将访问堆栈中的任何值 - >垃圾。

答案 2 :(得分:1)

此程序是未定义的行为。由于程序是未定义的行为,编译器有权拒绝编译它。

  

(C99,6.2.7p2)“所有引用相同对象或函数的声明都应具有兼容类型;否则,行为未定义。”

程序中的两个函数声明不兼容;它们没有相同数量的参数。

  

(C99,6.7.5.3p15)“对于两种兼容的功能类型,两者都应指定兼容的返回类型。此外,参数类型列表,如果两者都存在,应在参数数量和使用中一致。省略号终止符;相应的参数应具有兼容的类型。“

答案 3 :(得分:0)

它可以是任何值,来自堆栈的垃圾我相信如果你这样调用方法。

程序将具有未定义的行为,因为您实际上不知道bool参数的值。它也可能在执行期间崩溃。

希望它有所帮助。

答案 4 :(得分:0)

它是未定义的行为 - 它可能有垃圾值,它也可能崩溃,取决于编译器和操作系统的调用约定。

编辑:如果从左到右推送其他参数也可以混合使用。