C中的变量参数,如何使用通用类型获取值?
我试图使用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(32位)系统中,这将保存所有的内存地址.所以,如果我使用int获得所有参数,这不会是一个问题,例如,“嘿,我是一个字符串”这个字符串的地址,通常适合一个32位变量,所以我只需要做一个演员 我是对的? 感谢所有答案. 解决方法
你不能按照你所描述的方式去做.
C调用约定是为了调用者在堆栈上放置参数,但它不会在类型上放置任何信息,因此被调用方必须有一种方法来找到它(至少是变量的大小). >每个类型的原型函数都没有问题. 因此你必须通过类型. 在某些情况下,您可以预测类型(例如:一个计数器后跟一些int,等等),但通常会将其传递给参数编码.你可以传递它像格式字符串像printf那样编码,由jldupont描述的联合技巧也很常见. 但无论如何你必须通过它. 你真的不能依赖底层数据二进制表示,甚至不能数据大小.即使程序在写入时似乎工作,它也没有兼容性,并且可以随系统,编译器的任何变化,甚至在更改编译选项时发生变化. 我们来看一个例子,你传递类型后跟参数(既不是联合技巧也不是像printf的格式字符串).它所做的是将所有将其传递的值转换为双倍并添加它们,没有真正有用的不是它: #include <stdio.h> #include <stdarg.h> enum mytypes {LONG,INT,FLOAT,DOUBLE }; double myfunc(int count,...){ long tmp_l; int tmp_i; double tmp_d; double res = 0; int i; va_list ap; va_start(ap,count); for(i=0 ; i < count; i++){ int type = va_arg(ap,enum mytypes); switch (type){ case LONG: tmp_l = va_arg(ap,long); res += tmp_l; break; case INT: tmp_i = va_arg(ap,int); res += tmp_i; break; case FLOAT: /* float is automatically promoted to double when passed to va_arg */ case DOUBLE: tmp_d = va_arg(ap,double); res += tmp_d; break; default: /* unknown type */ break; } } va_end(ap); return res; } int main(){ double res; res = myfunc(5,LONG,(long)1,(int)10,DOUBLE,(double)2.5,(double)0.1,(float)0.3); printf("res = %fn",res); } 这个例子使用C99中定义的新的stdarg可变标题.要使用它,您需要至少有一个固定参数到您的函数(在这个例子中它的计数).好的,如果这样,你可以在你的函数中有几个可变列表(例如像myfunc(int count1,…,int count2,…)).不好的是,你不能有一个纯粹的可变功能(即像myfunc(…)这样的东西,就像旧的格式一样,你仍然可以使用旧的格式,使用varargs兼容性头,但更复杂,很少有必要,因为你需要类型,但也有一些方式来知道列表完成,像count这样的东西是方便的(但不是唯一的办法,例如可以使用’终止符’). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |