让我们在一个文件中说我在同一个项目的两个文件中有一些代码
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。谢谢。!
答案 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)
它是未定义的行为 - 它可能有垃圾值,它也可能崩溃,取决于编译器和操作系统的调用约定。
编辑:如果从左到右推送其他参数也可以混合使用。