printf函数原理以及可变参函数

来源:互联网 发布:淘宝店铺模块制作 编辑:程序博客网 时间:2024/05/19 02:01

#include <stdio.h>#include <stdarg.h>typedef char* va_list;#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )//第一个可选参数地址#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )//下一个参数地址#define va_end(ap) ( ap = (va_list)0 )// 将指针置为无效 void outArgs(const char* a, ...);void outInt(int i){printf("%d", i);}void outFloat(float i){printf("%f", i);}void outArgs(const char* fmt, ...){va_list arg_ptr;char cTmp = 0;char* ssTmp = 0;int iTmp = 0;float fTmp = 0;const char* p = fmt;va_start(arg_ptr, fmt);while((*p) != 0){if(*p != '%'){putchar(*p);p++;continue;}else{p++;switch(*p){case 'd':iTmp = va_arg(arg_ptr, int);outInt(iTmp);break;case 'c':cTmp = va_arg(arg_ptr, char);putchar(cTmp);break;case 'f':fTmp = va_arg(arg_ptr, float);outFloat(fTmp);break;case 's':ssTmp = va_arg(arg_ptr, char*);puts(ssTmp);break;}p++;continue;}}va_end(arg_ptr);}void main(){outArgs("My name is wwy:%d %d %d %f", 1000, 3, 15, 185.00);}

今天研究了下 printf(const char*, ...); 函数的构成,顺便理解并实践了下可变参函数。

写可变参函数需要引用头文件 stdarg.h 打开该文件可以发现主要内容如下:

typedef char* va_list;

#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )//第一个可选参数地址
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )//下一个参数地址
#define va_end(ap) ( ap = (va_list)0 ) // 将指针置为无效 

参考这个帖子吧,很详细。

http://www.ibm.com/developerworks/cn/linux/l-va/index.html


原创粉丝点击