gpt4 book ai didi

c - 具有未知类型名称的 va_list - 只有字节大小是已知的!

转载 作者:太空狗 更新时间:2023-10-29 15:06:33 25 4
gpt4 key购买 nike

我有一个 C 编程问题:我想编写一个带有可变参数列表的函数,其中不知道每个参数的具体类型 - 只知道它的大小(以字节为单位)。这意味着,如果我想获得一个 int 参数,我(之前的某个地方)定义:将有一个带有 sizeof( int ) 的参数,该参数由回调函数 xyz 处理。

我的可变参数函数现在应该从它的调用中收集所有信息,真正的数据类型特定操作(也可以是用户定义的数据类型)仅通过回调函数处理。

在标准的 va_arg 函数中,不可能说“从我的参数列表中获取 X 字节的值”,所以我想这样做。在这种情况下,我的数据类型是 double 的,但它可以是任何其他字节数(甚至是可变字节数)。

#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>

int fn( int anz, ... )
{
char* p;
int i;
int j;
va_list args;
char* val;
char* valp;
int size = sizeof( double );

va_start( args, anz );

val = malloc( size );

for( i = 0; i < anz; i++ )
{
memcpy( val, args, size );
args += size;

printf( "%lf\n", *( (double*)val ) );
}

va_end( args );
}

int main()
{
fn( 1, (double)234.2 );
fn( 3, (double)1234.567, (double)8910.111213, (double)1415.161718 );

return 0;
}

它适用于我,在 Linux (gcc) 下。但我现在的问题是:这真的是便携的吗?还是会在其他系统和编译器下失败?

我的替代方法是替换

                memcpy( val, args, size );
args += size;

            for( j = 0; j < size; j++ )
val[j] = va_arg( args, char );

但是后来,我的值(value)观出了问题。

对此有什么想法或帮助吗?

最佳答案

va_list 上执行算术是不可移植的极端。您应该正常使用 va_arg 并使用与参数大小相同的类型,它可能可以在任何地方工作。为了“更便于携带”,您应该为此目的使用无符号整数类型(uint32_t 等)。

关于c - 具有未知类型名称的 va_list - 只有字节大小是已知的!,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3213350/

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