C语言补丁原理,C语言可变长參数实现原理
(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语言可变长參数实现原理相关推荐
- C语言结构体及函数传递数组參数演示样例
C语言结构体及函数传递数组參数演示样例 注:makeSphere()函数返回Sphere结构体,main函数中.调用makeSphere()函数,传递的第一个參数为数组,传递的数组作为指针. post ...
- 具体解释可变參数列表
可变參数 至少有一个參数 比如:void add(int a,- ){} 例题 模拟printf()函数 #include <stdio.h> #include <stdarg ...
- 可变参数表 C语言 多态,C语言可变长参数实现“多态”.pdf
您所在位置:网站首页 > 海量文档  > 计算机 > C/C++资料 C语言可变长参数实现"多态" ...
- c语言怎样获得函数内参数的值_C语言可变参数函数的实现原理
在本人的<C语言可变参数函数的实现方法>一文中,介绍了如何建立自己的可变参数函数. 下面继续介绍可变参数函数的实现原理. 在汇编语言程序设计中,详细介绍了子程序的实现思想: (1)子程序只 ...
- C语言-数据结构-可变长顺序表的删除操作
[问题描述] 实现可变长顺序表的删除算法.任务要求:通过顺序表的初始化.插入算法,创建顺序表.根据删除需求,删除指定的顺序表元素. [输入形式] 第一行输入整数N(1<=N<=100),M ...
- C语言-数据结构-可变长顺序表的查找操作
[问题描述] 实现可变长顺序表的查找算法.任务要求:通过顺序表的初始化.插入建立顺序表,根据查找要求,返回查找结果. [输入形式] 第一行输入整数N(1<=N<=100),M(1<= ...
- C语言-数据结构-可变长顺序表的初始化,插入和输出
问题描述: 实现可变长顺序表的建表过程.任务要求:通过顺序表的初始化.插入算法,实现顺序表的建表,并依次输出顺序表元素. [输入形式] 第一行输入整数N(1<=N<=100),表示创建长度 ...
- c语言一行代码太长,C语言修改一行代码,运行效率居然提升数倍,这个技巧你知道吗...
对编译.链接.OS内核.系统调优等技术感兴趣的童鞋,不妨右上角关注一下吧,近期会持续更新相关方面的专题文章!引言 近日,网上看到一篇文章,分析数组访问的性能问题.文章经过一系列"有理有据&q ...
- 参数控制c语言代码走向,C语言可变参数完全解读
本文转自:http://www.cnblogs.com/wangyonghui/archive/2010/07/12/1776068.html 一.是什么 我们学习C语言时最经常使用printf()函 ...
最新文章
- C/C++ 头文件 #pragma once vs #ifndef
- opencv轮廓及点在轮廓内判断
- 怎样将两个html页面合并,如何把WORD的两个页面合并在一起?
- springboot报错---No identifier specified for entity: com.example.demo.entity.User
- Windows命令行提取日期时间
- LeetCode-185 : sql分组排序再取前几位
- 判定是否支持XHTML
- php实现事件监听与触发的方法
- 「硬见小百科」30个EMC标准电路分享
- 动态链接库dll注册函数DllRegisterServer的调试
- 计算机专业考研英语二国家线,考研英语二国家线多少,2020年考研英语国家线多少?...
- java 基础:方法/函数
- 2020杭电计算机考研经验帖
- 创业缺乏的不是钱,是智慧
- 用python实现生成验证码图片
- php命令提示无效,window_Win7系统命令提示符输入指令无效问题的解决办法,Win7系统命令提示符输入指令无 - phpStudy...
- 神器Overleaf!
- 抢鞋软件bot服务器系统,抢鞋子bot机器人有用吗 抢鞋子用什么APP
- 【笔试——腾讯2021实习笔试题第二次2021.4.4】第3题 n人高空过钢索
- 用负片制作中途曝光作品
热门文章
- HALCON示例程序vessel.hdev血管的分割与测量
- 庖丁解牛TLD(二)——初始化工作(为算法的准备)
- 浅谈OpenCV[轉]
- 学习笔记(31):Python网络编程并发编程-定时器
- faster rcnn学习之rpn训练全过程
- librosa能量_librosa与python_speech_features
- mysql 5.6 linux安装配置_linux手动安装配置mysql5.6
- 石油采集(求联通区域) 2018多校寒假集训 (dfs+二分匹配)
- safari图片跨域
- 步步为营-77-Ajax简介