概要
众所周知,C++支出函数重载,而C语言默认是不支持。但是,C语言可以通过可变参数实现类似函数重载的功能。
如 Linux C 的open()函数,这个函数有2个版本。有一个可选的第三个参数时只需要文件可能被创建。第三个参数描述了使用新文件的权限设置。
那么我们如何指定一个可选的额外参数给C函数呢?这是一种C版本的函数重载。显然它不是由C++的”碾压”技术实现的,而是可以使用va_args包。
此函数的实现需要三个参数,最后一个参数为可选的可变参数,而需要使用可选的第三个参数时,需要借助第二个参数某个特定的值:
在上面的代码中,我们通过解析参数,然后选择调用 va_overload2() 或 va_overload3()。POSIX open()函数的原理和这个过程类似。
可变参数说明
程序运行结果如下:
上述的宏原型如下所示:
va_list是在C语言中解决变参问题的一组宏,用于获取不确定个数的参数。
在函数定义中,可变参数表之前必须有一个或多个已知参数,其中最右者为last_parm。在调用va_start()时,last_parm名被用作第二个参数。
任何可变长度的变元被访问之前,必须先用va_start()初始化变元指针ap。初始化ap后,经过对va_arg()的调用,以作为下一个参数类型的参数类型,返回参数。最后取完所有参数并从函数返回之前,必须调用va_end()。由此确保堆栈的正确恢复。
案例
案例1
案例2
案例3
程序运行结果如下:
github源代码:https://github.com/mikejiangsky/c_overload.git