c语言入参数量不确定,如何在C语言中实现参数个数不确定的函数.pdf

如何在 C 语言中实现参数个数不确定的函数 C 语言中有一种长度不确定的参数 形如 它主要用在参数个数不确定的函数中 我们最容易想 到的例子是 printf 函数 注意 在 C 中有函数重载 overload 可以用来区别不同函数参数的调用 但它还是不能表示任意数量的函数参数 C 语言用 va start 等宏来处理这些可变参数 这些宏看起来很复杂 其实原理挺简单 就是根据参数入 栈的特点从最靠近第一个可变参数的固定参数开始 依次获取每个可变参数的地址 在标准 C 语言中定义了一个头文件专门用来对付可变参数列表 它包含了一组宏 和一个 v a list 的 typedef 声明 针对不同平台有不同的宏定义 我们选取 X86 平台下的宏定义 typedef char va list define INTSIZEOF n sizeof n sizeof int 1 define va start list list char int j 0 va start arg ptr i j va arg arg ptr int va end arg ptr printf d d n i j return 问题 运行时才确定的参数 有没有办法写一个函数 这个函数参数的具体形式可以在运行时才确定 答案与分析 目前没有 正规 的解决办法 不过独门偏方倒是有一个 因为有一个函数已经给我们做出了这方面的榜样 那就是 main 它的原型是 int main int argc char argv 深入想一下 只能在运行时确定参数形式 也就是说你没办法从声明中看到所接受的参数 也即是参数 根本就没有固定的形式 常用的办法是你可以通过定义一个 void 类型的参数 用它来指向实际的参数区 然后在函数中根据根据需要任意解释它们的含义 这就是 main 函数中 argv 的含义 而 argc 则用来表明实际的参数个数 这为我们使用提供了进一步的方便 当然 这个参数不是必需的 虽然参数没有固定形式 但我们必然要在函数中解析参数的意义 因此 理所当然会有一个要求 就是调 用者和被调者之间要对参数区内容的格式 大小 有效性等所有方面达成一致 否则南辕北辙各说各话就 惨了 问题 可变长参数中类型为函数指针 我想使用 va arg 来提取出可变长参数中类型为函数指针的参数 结果却总是不正确 为什么 答案与分析 这个与 va arg 的实现有关 一个简单的 演示版的 va arg 实现如下 define va arg argp type type argp sizeof type sizeof type 其中 argp 的类型是 char 如果你想用 va arg 从可变参数列表中提取出函数指针类型的参数 例如 int 则 va arg argp int 被扩展为 int argp sizeof int sizeof int 显然 int 是无意义的 解决这个问题的办法是将函数指针用 typedef 定义成一个独立的数据类型 例如 typedef int funcptr 这时候再调用 va arg argp funcptr 将被扩展为 funcptr argp sizeof funcptr sizeof funcptr 这样就可以通过编译检查了 问题 可变长参数的获取 有这样一个具有可变长参数的函数 其中有下列代码用来获取类型为 float 的实参 va arg argp float 这样做可以吗 答案与分析 不可以 在可变长参数中 应用的是 加宽 原则 也就是 float 类型被扩展成 double char short 被扩展成 int 因此 如果你要去可变长参数列表中原来为 float 类型的参数 需要用 va arg a rgp double 对 char 和 short 类型的则用 va arg argp int IAR AVR 下测试如下 i nclude 这个头文件要 加上 int TT AVR int i va list arg ptr volatile char pCH volatile char N va start arg ptr i pCH va arg arg ptr char 第一个参数 N va arg arg ptr char 第二个参数 va end arg ptr return 0 main void TT AVR 1 0123456 99

展开阅读全文

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值