(1)      C语言可变參数

我们能够从C语言的printf得出可变參数的作用。printf函数的原型例如以下:

int printf ( const char * format, ... );

通过使用可变个数參数,就是传入的參数个数是可变的,如printf须要依据format实參传入多个实參。

(2)      C语言可变參数的使用

以下一个函数myprintf是自己实现的比較简单的printf函数。不完整可是能够说明可变參数的使用方法。

/*

* Author: guojun07

*/

#include

#include

#include

#include

void myprintf(char *format, ...) {

va_list ap;

int pos = 0;

int int_val = 0;

float f_val;

char buf[64];

memset(buf, 0, 64);

// 得到全部的參数放到下一个list中ap中

va_start(ap, format);

while (format[pos] != ' ') {

// 推断'%'。表示要得到下一个參数

if (format[pos] == '%') {

pos ++;

switch(format[pos]) {

case 'd':

case 'u':

// 得到ap中的下一个參数

int_val = va_arg(ap, int);

sprintf(buf, "%d", int_val);

// 将数据写到标准输出

write(STDOUT_FILENO, buf, strlen(buf));

memset(buf, 0, 64);

pos ++;

break;

case 'f':

// 得到ap中的下一个參数

f_val = (float)va_arg(ap, double);

sprintf(buf, "%f", f_val);

// 将数据写到标准输出

write(STDOUT_FILENO, buf, strlen(buf));

memset(buf, 0, 64);

pos ++;

break;

default:

break;

}

} else {

write(STDOUT_FILENO, &(format[pos]), 1);

pos ++;

}

}

}

int main(void){

myprintf("this is a testing, i = %d, u = %u, f = %f

", -1, 5, 0.2);

return 0;

}

程序的数据结果例如以下:

guojun8@guojun8-desktop:~/test/valist$ ./main

this is a testing, i = -1, u = 5, f = 0.200000

(3)      实现

以下介绍C语言可变长度參数的实现。事实上现与一个数据结构(va_list)和三个宏(va_start, va_end, va_arg)相关,从源代码中能够看到这些实现以下的来自linux内核源代码中的文件(include/acpi/platform/acenv.h)

#ifndef _VALIST

#define _VALIST

typedef char *va_list;

#endif        /* _VALIST */

/*

* Storage alignment properties

*/

#define  _AUPBND                (sizeof (acpi_native_int) - 1)

#define  _ADNBND                (sizeof (acpi_native_int) - 1)

/*

* Variable argument list macro definitions

*/

#define _bnd(X, bnd)            (((sizeof (X)) + (bnd)) & (~(bnd)))

#define va_arg(ap, T)           (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))

#define va_end(ap)              (void) 0

#define va_start(ap, A)         (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))

a)         va_list

从实现中能够看出va_list类型实际上就是一个指针。

b)        va_start

这个宏的作用是将T所指向的參数后面的内容放到ap中。当中_bnd (A,_AUPBND)是返回A的size并与系统的机器位数对齐。由于參数在栈中的地址一定是与系统的字长对齐的,当中acpi_native_int就表示机器字长。

c)         va_end

这个宏的作用就是返回0。

d)        va_arg

这个宏的作用是取得ap指向的当前的參数,并将ap指向參数列表中的下一个參数。

C语言补丁原理,C语言可变长參数实现原理相关推荐

  1. C语言结构体及函数传递数组參数演示样例

    C语言结构体及函数传递数组參数演示样例 注:makeSphere()函数返回Sphere结构体,main函数中.调用makeSphere()函数,传递的第一个參数为数组,传递的数组作为指针. post ...

  2. 具体解释可变參数列表

    可变參数   至少有一个參数 比如:void add(int a,- ){} 例题  模拟printf()函数 #include <stdio.h> #include <stdarg ...

  3. 可变参数表 C语言 多态,C语言可变长参数实现“多态”.pdf

    您所在位置:网站首页 > 海量文档 &nbsp>&nbsp计算机&nbsp>&nbspC/C++资料 C语言可变长参数实现"多态" ...

  4. c语言怎样获得函数内参数的值_C语言可变参数函数的实现原理

    在本人的<C语言可变参数函数的实现方法>一文中,介绍了如何建立自己的可变参数函数. 下面继续介绍可变参数函数的实现原理. 在汇编语言程序设计中,详细介绍了子程序的实现思想: (1)子程序只 ...

  5. C语言-数据结构-可变长顺序表的删除操作

    [问题描述] 实现可变长顺序表的删除算法.任务要求:通过顺序表的初始化.插入算法,创建顺序表.根据删除需求,删除指定的顺序表元素. [输入形式] 第一行输入整数N(1<=N<=100),M ...

  6. C语言-数据结构-可变长顺序表的查找操作

    [问题描述] 实现可变长顺序表的查找算法.任务要求:通过顺序表的初始化.插入建立顺序表,根据查找要求,返回查找结果. [输入形式] 第一行输入整数N(1<=N<=100),M(1<= ...

  7. C语言-数据结构-可变长顺序表的初始化,插入和输出

    问题描述: 实现可变长顺序表的建表过程.任务要求:通过顺序表的初始化.插入算法,实现顺序表的建表,并依次输出顺序表元素. [输入形式] 第一行输入整数N(1<=N<=100),表示创建长度 ...

  8. c语言一行代码太长,C语言修改一行代码,运行效率居然提升数倍,这个技巧你知道吗...

    对编译.链接.OS内核.系统调优等技术感兴趣的童鞋,不妨右上角关注一下吧,近期会持续更新相关方面的专题文章!引言 近日,网上看到一篇文章,分析数组访问的性能问题.文章经过一系列"有理有据&q ...

  9. 参数控制c语言代码走向,C语言可变参数完全解读

    本文转自:http://www.cnblogs.com/wangyonghui/archive/2010/07/12/1776068.html 一.是什么 我们学习C语言时最经常使用printf()函 ...

最新文章

  1. C/C++ 头文件 #pragma once vs #ifndef
  2. opencv轮廓及点在轮廓内判断
  3. 怎样将两个html页面合并,如何把WORD的两个页面合并在一起?
  4. springboot报错---No identifier specified for entity: com.example.demo.entity.User
  5. Windows命令行提取日期时间
  6. LeetCode-185 : sql分组排序再取前几位
  7. 判定是否支持XHTML
  8. php实现事件监听与触发的方法
  9. 「硬见小百科」30个EMC标准电路分享
  10. 动态链接库dll注册函数DllRegisterServer的调试
  11. 计算机专业考研英语二国家线,考研英语二国家线多少,2020年考研英语国家线多少?...
  12. java 基础:方法/函数
  13. 2020杭电计算机考研经验帖
  14. 创业缺乏的不是钱,是智慧
  15. 用python实现生成验证码图片
  16. php命令提示无效,window_Win7系统命令提示符输入指令无效问题的解决办法,Win7系统命令提示符输入指令无 - phpStudy...
  17. 神器Overleaf!
  18. 抢鞋软件bot服务器系统,抢鞋子bot机器人有用吗 抢鞋子用什么APP
  19. 【笔试——腾讯2021实习笔试题第二次2021.4.4】第3题 n人高空过钢索
  20. 用负片制作中途曝光作品

热门文章

  1. HALCON示例程序vessel.hdev血管的分割与测量
  2. 庖丁解牛TLD(二)——初始化工作(为算法的准备)
  3. 浅谈OpenCV[轉]
  4. 学习笔记(31):Python网络编程并发编程-定时器
  5. faster rcnn学习之rpn训练全过程
  6. librosa能量_librosa与python_speech_features
  7. mysql 5.6 linux安装配置_linux手动安装配置mysql5.6
  8. 石油采集(求联通区域) 2018多校寒假集训 (dfs+二分匹配)
  9. safari图片跨域
  10. 步步为营-77-Ajax简介