C中的可变参数,如何获取具有通用类型的值?

问题描述 投票:12回答:6

我正在尝试使用具有通用类型的C stdarg.h lib。类型int是我的通用类型>请理解,请继续阅读。所以,我的问题是:

我有一个接受可变数量参数的函数。喜欢

void function (int paramN, ...);

在我的程序中,没有办法知道,这是变量参数的类型,它可以是char,数组,int,short,函数点等。]]

function (paramN, "Hey, I'm a string", 1, function_pint, array, -1); // -1 is a sentinel.

因此,我认为一个int是32位,在x86(32bits)系统中,它将保存所有内存地址。因此,如果我使用int来获取所有参数,那么这将不是问题,例如,“嘿,我是一个字符串”该字符串的地址,通常适合32bits变量,因此,我只需要使一个演员。

对吗?我可以做吗?注意:我不想使我的函数像printf(这种解决方案,在这种情况下不适合吗?)

感谢所有回答。对不起,我的英语不好。

我正在尝试使用具有通用类型的C stdarg.h lib。类型int是我的通用类型>请理解,请继续阅读。所以,我的问题是:我有一个函数,可以接受可变数量的...

c variadic-functions
6个回答
11
投票

您无法用描述的方式来做。


14
投票

为每个参数使用void *(或带类型的结构),并使用带有“类型”自变量(整数)的结构。包含实际值的指针/联合。

换句话说,每个参数都带有指向类型化结构的指针。此类型结构的每个实例都包含一个值。此“值”的类型包含在此类型结构中。


3
投票

您无法按照您描述的方式对变量参数进行此操作,因为除非您明确进行编译,否则编译后不会保留有关您传递的参数类型的信息。即使传递参数变量的地址也不会告诉您,因为内存中表示字符串的位可能表示数字或其他内容。

要使varargs处理变量类型,您可以将类型信息存储在参数本身中(例如,如jldupont在其回答中所述),也可以将信息存储在非变量参数中(例如,格式字符串printf)。


1
投票

http://en.wikipedia.org/wiki/Stdarg.h处理:

没有定义用于确定传递给函数的未命名参数的类型的机制。仅需要该功能即可以某种方式知道或确定此功能,其方法各不相同。


0
投票

请尝试在stdint.h中定义的u?intptr_t。这是一个整数,保证足以容纳一个指针。

您可能还想过传递一个浮点数时会发生什么;它被转换为double并通过。如果您的程序期望一个int,这将破坏其对堆栈的视图。哎哟。而且编译器无法捕捉到这一点。


0
投票

展开kriss构想

自C99起,使用_Generic传递给可变参数函数对参数。

© www.soinside.com 2019 - 2024. All rights reserved.