繁体   English   中英

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

[英]default parameters in function call in C

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

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。 谢谢。!

价值不仅仅取决于实施; 程序的整个行为是未定义的。 如果你把func1的声明放在一个头而不是file2.c并且你在file1.c包含那个头,那么好的C实践,编译器会拒绝编译它。

在实践中,您可能会观察到d具有一些任意的,不可预测的值,尽管您的程序可能也会神秘地崩溃。

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

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

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

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

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

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

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

希望能帮助到你。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM