c语言中可变参数的原理---printf()函数

原创 2011年01月15日 00:21:00

       函数原型: int printf(const char *format[,argument]...)
       返 回 值: 成功则返回实际输出的字符数,失败返回-1.
 函数说明:
       在printf()函数中,format后面的参数个数不确定,且类型也不确定,这些参数都存放在栈内.调用printf()函数时,根据format里的格式("%d %f...")依次将栈里参数取出.而取出动作要用到va_arg、va_end、va_start这三个宏定义,再加上va_list.
     (1)va_list事实上是一char *类型,即:
            typedef char* va_list;
     (2)三个宏定义:
            #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,type)  ( *(type *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) 
            #define va_end(ap)          ( ap = (va_list)0 )
   【attention】c语言中可变参数的原理---printf()函数
            int printf(const char* format,...);  
      使用过C语言的人所再熟悉不过的printf函数原型,它的参数中就有固定参数format和可变参数(用”…”表示).而程序员又可以用各种方式来调用printf,如:
            printf("%d ",value);  
            printf("%s ",str);  
            printf("the number is %d,string is:%s ",value,str);
       可以看出,该函数的参数格式不固定,参数类型不固定.在C语言中使用宏来处理这些可变参数.这些宏看起来很复杂,其实原理挺简单,即根据参数入栈的特点从最靠近第一个可变参数的固定参数开始,依次获取每个可变参数的地址.
 (1)宏va_start
      通过该宏定义可以获取到可变参数表的首地址,并将该地址赋给指针ap.
 (2)宏va_arg
      通过该宏定义可以获取当前ap所指向的可变参数,并将指针ap指向下一个可变参数.注意,该宏的第二个参数为类型.
 (3)宏va_end
      通过该宏定义可以结束可变参数的获取.


      程序员通过这三个宏定义就可以实现对可变参数的处理.例如:  

printf 函数原型

typedef char *va_list;#define   _AUPBND        (sizeof (acpi_native_int) - 1)#define   _ADNBND      ...
  • selooloo
  • selooloo
  • 2009年12月16日 10:57
  • 17146

C语言::printf()函数功能、原型、用法及实例

功能 printf函数可以根据指定格式从标准输出设备中输出信息. 原型 int printf( const char* format , [argument] ... ); (...
  • wangchuncheng211
  • wangchuncheng211
  • 2017年04月05日 15:41
  • 1126

自己动手写 printf函数

我们在C语言编程中会遇到一些参数个数可变的函数,例如printf() 这个函数,它的定义是这样的: int printf( const char* format, ...); 它除了有一个参数form...
  • jxusthusiwen
  • jxusthusiwen
  • 2010年09月19日 11:17
  • 7482

STM32 Printf函数实现方法

今天调试了stm32f407的ADC,一切顺利,然而用串口发送ADC结果时都是16进制数,看着很不爽。于是打算用用牛B的“printf”函数,按照以前的做法,在main文件中添加了“stdio.h”,...
  • wocao1226
  • wocao1226
  • 2014年01月15日 17:17
  • 3116

c语言中可变参数的原理---printf()函数

函数原型: int printf(const char *format[,argument]...)        返 回 值: 成功则返回实际输出的字符数,失败返回-1.  函数说明:    ...
  • tangcong29
  • tangcong29
  • 2014年01月18日 10:28
  • 989

printf 函数的原理以及在单片机上重定向至LCD12832的实现

首先,printf 函数的的原型是这样的: int printf(char const * format, ...); *format 就是要格式化的字符串的起始地址。注意这个必须是字符串以'\0...
  • mazhao141
  • mazhao141
  • 2015年11月29日 09:36
  • 1009

printf内部实现

通过printf的简易实现,熟悉变长参数表
  • dudubird90
  • dudubird90
  • 2015年09月16日 15:26
  • 2355

printf_系统调用过程分析_write() putc() 函数实现

系统调用”是操作系统提供给用户程序进行调用的一些服务。这些服务是系统预先提供的函数,在这一点上系统调用与普通的用户程序是没有区别的。而区别则在于“系统调用”是由操作系统提供给用户的,这些服务更接近底层...
  • edonlii
  • edonlii
  • 2014年02月28日 14:36
  • 5531

关于printf()函数的点(还有各种各样的转换说明等你发现哦~)

一:在转换说明中指定精度输出 (下面是引用的百度的回答~~)  从上面的几个结果,你可以看出来: %m.ns: m是整个输出的个数,比如上面的10(包括空格的输出); //n...
  • qq_37385726
  • qq_37385726
  • 2017年03月04日 09:42
  • 380

printf 函数的实现 *

/*  * =====================================================================================  *  *...
  • bbs598598
  • bbs598598
  • 2016年12月17日 19:08
  • 407
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c语言中可变参数的原理---printf()函数
举报原因:
原因补充:

(最多只允许输入30个字)