gpt4 book ai didi

c - 如何以可移植的方式将可变参数列表传递给 vprintf?

转载 作者:太空宇宙 更新时间:2023-11-04 05:23:37 24 4
gpt4 key购买 nike

我有一个代码可以从设备接收 32 位值的二进制数组并使用 vsprintf 打印它们,如下所示:

void print_stuff(int32_t *p, const char *format)
{
vprintf( format, (va_list)p);
}

(这是简化的;确保值与格式等匹配)

基本上这依赖于在普通 x86 中 va_list 只是一个指针(或数组)。编译时没有警告。

现在我需要将其移植到 ARM (arm-linux-gnueabihf) 和 x64,它甚至无法编译。 ARM 的 GCC 4-something 说“错误:请求转换为非标量类型”

如何以可移植的方式从二进制数组创建 va_list?或者至少分别针对 32 位和 64 位拱门——没有任何“ native 调用接口(interface)”库是可能的吗?如果这是不可能的,那么是否有适合这项任务的任何其他标准或 GNU 库函数?

调用它的代码示例:

#include <stdio.h>
#include <stdarg.h>
#include <stdint.h>
#ifndef __GNUC__
#error Only Linux, other platforms/compilers not needed
#endif

int main() {
uint32_t data[10];
int i;
const char *fmt = "%x %x %x %x\n";
// Simulation of reading the data
for(i = 0; i < 10, i++) data[i] = 0x100 + i;
print_stuff(data, fmt);
return 0;
}

最佳答案

由于格式是预定义的,您确切地知道要传入多少个参数。因此,将您需要的参数准确地传递给您的函数,而不是传递一个数组。然后,您将函数更改为使用 ... 作为参数,并从中获取 va_list

所以你的函数看起来像这样:

void print_stuff(const char *format, ...)
{
va_list args;

va_start(args, format);
vprintf(format, args);
va_end(args);
}

你会这样调用它:

const char *fmt = "%x %x %x %x\n";
...
print_stuff(fmt, data[0], data[1], data[2], data[3]);

关于c - 如何以可移植的方式将可变参数列表传递给 vprintf?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45078719/

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