gpt4 book ai didi

c - 使用 char[] 获取可变大小的 C 可变参数

转载 作者:太空宇宙 更新时间:2023-11-04 01:53:07 25 4
gpt4 key购买 nike

我正在用 C 编写一个容器库,我想在我的实现中使用可变参数,如下所示:

void stack_push(stack *self, T item);
T stack_pop(stack *self);

显然,C 没有泛型类型,所以我使用 void * 指针:

void stack_push(stack *self, void *item);
void *stack_pop(stack *self);

但是,我正在考虑使用可变参数传递输入:

void stack_push(stack *self, ...);

这可行,因为项目大小是在容器初始化时确定的。

我的问题是:C 访问使用不同类型但大小相同的 vararg 成员是否有效?

void stack_push(stack *self, ...)
{
struct wrapper {
char item[self->item_size];
};

va_list ap;
struct wrapper item;

va_start(ap, self);
item = va_arg(ap, struct wrapper);
va_end(ap);

stack_grow(self, self->size+1);
memcpy(self->items+self->item_size*self->size++, &item, self->item_size);
}

最佳答案

按照您的意愿行事会引发未定义的行为。

来自 C 标准(C11 草案):

7.16.1.1 The va_arg macro

Synopsis

1

#include <stdarg.h>
type va_arg(va_list ap, type);

Description

2 [...] if type is not compatible with the type of the actual next argument (as promoted according to the default argument promotions), the behavior is undefined, except for the following cases:

— one type is a signed integer type, the other type is the corresponding unsigned integer type, and the value is representable in both types;

— one type is pointer to void and the other is a pointer to a character type.

这两个异常似乎都不符合您的用例。

关于c - 使用 char[] 获取可变大小的 C 可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39678986/

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