【发布时间】:2011-03-20 01:24:01
【问题描述】:
尝试编写 nodejs sprintf 本机实现,同时提高我的 c++ 技能,我已经研究了如何为 sprintf 提供未知长度的参数。我首先虽然我可以使用 vsprintf 但找不到如何填充它。基本上,nodejs/v8 绑定给了我一个参数数组,我可以将其转换为向量或其他东西,但不知道如何将其转换为 vsprintf 预期的 va_list 或任何其他可以使其工作的替代方案。
谁能给我建议一个策略?
【问题讨论】:
尝试编写 nodejs sprintf 本机实现,同时提高我的 c++ 技能,我已经研究了如何为 sprintf 提供未知长度的参数。我首先虽然我可以使用 vsprintf 但找不到如何填充它。基本上,nodejs/v8 绑定给了我一个参数数组,我可以将其转换为向量或其他东西,但不知道如何将其转换为 vsprintf 预期的 va_list 或任何其他可以使其工作的替代方案。
谁能给我建议一个策略?
【问题讨论】:
通常它依赖于编译器和平台。您可以查看va_start 和va_arg 等您选择的编译器的实现,并使用asm 指令以正确的方式将数据推送到堆栈中。
但我不会这样做,如果模仿 sprintf 对您的实现至关重要 - 循环参数并一次处理一个连接结果,那将更加健壮和可移植。
【讨论】:
va_list,因为va_list实际上只是一个指针。不过,它仍然是非常特定于实现的,而且由于他无论如何都必须处理格式字符串以找出要存储的数据类型,所以他不妨按照您的建议逐个处理它。