C 概念中的可变函数

问题描述 投票:0回答:1

我对C中可变参数函数的概念不是很清楚。 在实际应用中,va_list、va_start、va_end等宏代表什么?

据我了解, va_start 声明了一个列表, va_start 初始化了它, va_end 进行了清理。但我不明白如何在实践中使用它们,并且当我在较低的抽象级别查看宏时,我不清楚它们代表什么。

如果可能的话,用一些例子对这个概念进行更实际的解释对我来说非常有用,谢谢。

c macros variadic-functions
1个回答
0
投票

C语言早期,传递参数约定是参数逆序放入栈中。并且参数的类型和数量都不是函数声明的一部分,只有返回值类型。然后,只要可以从修复部分推断出参数数量,就可以轻松处理可变数量的参数(至少在汇编代码中)。正如评论中已经说过的,这正是标准库中的

printf
scanf
函数的工作方式。

va_*
中的
stdarg.h
后来被添加为直接在C语言中处理这些可变参数函数的可移植方式,并且它们被指定为不透明宏。基本原理是,传递参数的具体细节是语言实现的细节,而实现只需为 C 程序员提供一种能够访问参数的方法,即知道参数的顺序和类型。在运行时而不是在编译时。 在常见的实现中,它们只是一种在程序堆栈中提取指向包含参数的

frame

的指针并迭代该帧的方法。 有关使用示例,您可以查看优秀的

cpp 参考站点

© www.soinside.com 2019 - 2024. All rights reserved.