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(){

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这样的东西是方便的(但不是唯一的办法,例如可以使用’终止符’).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值