c语⾔取变量的值,C中的变量参数,如何使⽤通⽤类型获取值?你不能按照你所描述的⽅式去做.
C调⽤约定是为了调⽤者在堆栈上放置参数,但它不会在类型上放置任何信息,因此被调⽤⽅必须有⼀种⽅法来到它(⾄少是变量的⼤⼩).
>每个类型的原型函数都没有问题.
>使⽤变量或参数(可变)的函数更加棘⼿,您必须为每个参数调⽤va_arg来读取每个变量,并且必须提供va_arg的类型.如果您提供的类型不是编译器不会投诉的类型(它不能是运⾏时信息),但是任何事情都可能发⽣(通常是坏的).
因此你必须通过类型.
在某些情况下,您可以预测类型(例如:⼀个计数器后跟⼀些int,等等),但通常会将其传递给参数编码.你可以传递它像格式字符串像printf那样编码,由jldupont描述的联合技巧也很常见.
但⽆论如何你必须通过它.
你真的不能依赖底层数据⼆进制表⽰,甚⾄不能数据⼤⼩.即使程序在写⼊时似乎⼯作,它也没有兼容性,并且可以随系统,编译器的任何变化,甚⾄在更改编译选项时发⽣变化.
我们来看⼀个例⼦,你传递类型后跟参数(既不是联合技巧也不是像printf的格式字符串).它所做的是将所有将其传递的值转换为双倍并添加它们,没有真正有⽤的不是它:
#include
#include
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(){enum类型如何使用
double res;
res = myfunc(5,LONG,(long)1,(int)10,DOUBLE,(double)2.5,(double)0.1,(float)0.3);
printf("res = %f\n",res);
}
这个例⼦使⽤C99中定义的新的stdarg可变标题.要使⽤它,您需要⾄少有⼀个固定参数到您的函数(在这个例⼦中它的计数).好的,如果这样,你可以在你的函数中有⼏个可变列表(例如像myfunc(int count1,…,int count2,…)).不好的是,你不能有⼀个纯粹的可变功能(即像
myfunc(…)这样的东西,就像旧的格式⼀样,你仍然可以使⽤旧的格式,使⽤varargs兼容性头,但更复
杂,很少有必要,因为你需要类型,但也有⼀些⽅式来知道列表完成,像count这样的东西是⽅便的(但不是唯⼀的办法,例如可以使⽤’终⽌符’).

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。