gpt4 book ai didi

c - 如何在 C 中实现 stdarg

转载 作者:太空狗 更新时间:2023-10-29 14:53:59 24 4
gpt4 key购买 nike

出于好奇,我希望为标准 C 库中的某些函数编写最少的替代品。至此,我已经完成了printf()strlen()strcpy()memcpy()memset()等等...但是当我尝试使用printf函数时,我不知道如何实现stdarg.h!有什么方法可以做到这一点?

它使用宏还是实际函数?

我在 32 位 x86 上使用 gccclang,如果它有助于使这个问题更容易回答的话。

最佳答案

在具有 cdecl 调用约定的 32 位 x86 上,参数在堆栈上传递:

^ higher addresses (lower on the stack)
|
| caller local variables
| ...
| argument 3
| argument 2
| argument 1
| return address
| saved EBP (usually)
| callee local variables
|
v lower addresses (higher on the stack)

您可以将 va_list 实现为指针。 va_start 可以获取传递给它的参数的地址并添加该参数的大小以移动到下一个参数。 va_arg 可以访问指针并将其撞到下一个参数。 va_copy 可以只复制指针值。 va_end 不需要做任何事情。

另一方面,如果您没有使用 cdecl(也许您正在使用 fastcall),那么您不是 32 位的,您不是 x86,这将不起作用;您可能需要处理寄存器而不仅仅是指针值。甚至它仍然不能保证工作,因为你依赖于未定义的行为;作为仅一个潜在问题的示例,内联可能会毁掉一切。这就是为什么头文件只是 typedef 将它传递给内置编译器的原因——在 C 中实现它是没有希望的,您需要编译器支持。甚至不要让我开始实现 setjmplongjmp...

关于c - 如何在 C 中实现 stdarg,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32291808/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com