printf函数实现

要实现printf函数需要考虑如下三点:

1.如何告诉printf传入参数的个数:参数个数不确定。

2.printf如何访问到这些参数。

3.函数调用完成后,系统如何释放在堆栈的参数。


printf函数的定义:(原型)

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

注:_cdecl是C/C++缺省调用方式。 

_cdecl调用约定:1.参数从右自左依次入栈。   2.调用者负责清理堆栈。 3.参数的数据类型不会导致编译阶段的错误。


实现如下:

    #include <stdio.h>  
    #include <stdarg.h>  
    void myprintf(const char *format, ...)  
    {  
                va_list ap;  
                char ch;  
             va_start(ap, format);  
             while(ch = *format++)  
                {  
                        switch(c)  
                        {  
                                 case 'c':  
                                  {  
                                                char ch1 = va_arg(ap, char);  
                                            putchar(ch1);  
                                            break;  
                                    }  
		case 's':  
             		{  
                      		char *p = va_arg(ap, char *);  
                     		 fputs(p,stdout);  
                      		break;  
              		}  
              		default:  
                       		putchar(ch);  
        		}//switch结束  
   	}//while 结束  
       	 va_end(ap);  
}//myprintf结束  


void  main()
{
        myprintf("c\ts\n",’A’,"hello");
}


VC++中stdarg.h里x86平台的宏定义

typedef char *  va_list;


#define _INTSIZEOF(n)   
        ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )


#define va_start(va_list  ap, format)
          ( ap = (va_list)& format+ _INTSIZEOF(format) )
#define va_arg(va_list  ap,type)   
          ( *(type*)((ap += _INTSIZEOF(type)) -_INTSIZEOF(type)) )
#define va_end(va_list  ap)      
( ap = (va_list)0 )



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值