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
      通过该宏定义可以结束可变参数的获取.


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

相关文章推荐

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

功能 printf函数可以根据指定格式从标准输出设备中输出信息. 原型 int printf( const char* format , [argument] ... ); (...

C语言可变参数及printf函数的实现

  • 2012年04月15日 16:53
  • 129KB
  • 下载

C语言中的可变参数函数 三个点“…”printf( const char* format, ...)

第一篇  C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为:  int printf( const char* format, ...);  它除...

【C语言】printf函数的简单实现(可变参数列表)

stdarg宏: 可变参数列表是通过宏来实现的,这些宏定义于stdarg.h头文件中,它是标准库的一部分。这个头文件声明一个类型va_list 和三个宏va_start、va_arg和va_end。我...

C语言中的可变参数函数 三个点“…”printf( const char* format, ...) 博客分类: C语言 ANSI C CC++C#D语言编程 第一篇

博客分类: C语言 ANSI C CC++C#D语言编程 第一篇 C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: int printf( co...

C语言中可变参数函数实现原理

C语言中可变参数函数实现原理

C语言可变参数函数执行原理以应用

参数可变函数又称VA函数,例如printf,scanf,exec。 1.举例: //fun:打印n后面参数的值 void fun(int n, ...); int main() {    ...
  • aosuqin
  • aosuqin
  • 2011年10月19日 15:00
  • 337

C语言函数之可变参数原理:va_start、va_arg及va_end !!!!!!和printascii在kernel启动前的应用

说到C语言函数可变参数,我们最先想到的可能就是printf、scanf、printk了。在Linux-2.6.24.7内核源码里,printk函数原型如下: asmlinkage int ...

C语言函数之可变参数原理:va_start、va_arg及va_end

本文转载自:http://blog.chinaunix.net/uid-23089249-id-34493.html    作者:lingdxuyan 说到C语言函数可变参数,我们最...
  • vgxpm
  • vgxpm
  • 2015年07月15日 22:57
  • 412
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c语言中可变参数的原理---printf()函数
举报原因:
原因补充:

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