C/C++中可变参数函数的实现

在C语言的stdarg.h头文件中提供了三个函数va_start, va_end,va_arg和一个类型va_list。利用它们,我们可以很容易实现一个可变参数的函数。首先简单介绍一下这三个函数。

假设现在有一个名为f的函数,其函数定义为:

void f(int a, int b, ...)

那么,在函数的内部,为了获得这些可变参数,就需要利用到va_start、va_arg和va_end三个函数。

va_list类型的变量可以用于存储可变类型的变量,用它可以对可变变量进行遍历;

 va_list ap

在使用ap之前,必须调用va_start使得ap和可变参数进行关联;

va_start(ap, b);

va_start的第二个参数是函数参数列表中最后一个非可变参数的参数;

然后就可以调用va_arg对参数进行访问了;

type va_arg( ap, type);

在变量处理完成之后,程序结束之前,应该调用va_end一次;

void va_end(ap);

下面的程序展示了一种可变参数函数和CString::FormatV函数联合使用的技术。该技术在VC++编程中被广泛的使用:

#include <iostream>
#include <cstring>
#include <string.h>
#include <atltime.h>

 usingnamespace::std;

void WriteLogEntry(LPCTSTR pstrFormat, ...)
{
  CTime timeWrite;
  timeWrite = CTime::GetCurrentTime();
  CString str = timeWrite.Format(_T("%d %b %y %H:%M:%S - "));
  ATLTRACE(str);

  va_list args;
  va_start(args, pstrFormat);
   str.FormatV(pstrFormat, args);
  ATLTRACE(str);
  return;
}

int main()
{
  WriteLogEntry(_T("Start Program!\n"));
  WriteLogEntry(_T("Program has execute %d lines!\n"),201);
  WriteLogEntry(_T("error %d occured at %d line!\n"),1170, 400);
  WriteLogEntry(_T("Program Abouted!"));

}
时间: 2024-08-27 16:14:46

C/C++中可变参数函数的实现的相关文章

【转】C/C++中可变参数函数的实现

转自:http://www.cnblogs.com/cylee025/archive/2011/05/23/2054792.html 在C语言的stdarg.h头文件中提供了三个函数va_start, va_end,va_arg和一个类型va_list.利用它们,我们可以很容易实现一个可变参数的函数.首先简单介绍一下这三个函数. 假设现在有一个名为f的函数,其函数定义为: void f(int a, int b, ...) 那么,在函数的内部,为了获得这些可变参数,就需要利用到va_start.

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

C函数调用的栈结构 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈.例如,对于函数: void fun(int a, int b, int c) { int d; ... } 其栈结构为 0x1ffc-->d 0x2000-->a 0x2004-->b 0x2008-->c 对于在32位系统的多数编译器,每个栈单元的大小都是sizeof(int), 而函数的每个参数都至少要占一个栈单

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

一.可变参数函数实现原理 C函数调用的栈结构: 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈. 本文地址:http://www.cnblogs.com/archimedes/p/variable-parameter.html,转载请注明源地址. 例如,对于函数: void fun(int a, int b, int c) { int d; ... } 其栈结构为 0x1ffc-->d 0x200

c 中可变参数的实现

我们在C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为:     例一: int   printf(   const   char*   format,   ...);它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的(用三个点“…”做参数占位符),实际调用时可以有以下的形式: printf("%d",i);        printf("%s",s);     printf("the   numbe

C语言中可变参数的函数(三个点,“...”)

C语言中可变参数的函数(三个点,"...") 本文主要介绍va_start和va_end的使用及原理. 在以前的一篇帖子Format MessageBox 详解中曾使用到va_start和va_end这两个宏,但对它们也只是泛泛的了解. 介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理: 1.在C中,当我们无法列出传递函数的所有实参的类型和数目时,可以用省略号指定参数表 void foo(...); void foo(parm_list,...); 这种方式和我们以前认识的不大

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

第一篇 C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的(用三个点“…”做参数占位符),实际调用时可以有以下的形式: printf("%d",i); printf("%s",s); printf("the number is %d ,string is:%s",

38 py改变函数参数的值关键字参数和参数默认值函数中可变参数将序列中的元素值作为函数对应的参数值传

第五课:改变函数参数的值 一个python函数可以有任意多个参数,在一个函数的外部来定义变量,然后把变量作为参数传入到函数内,并且在函数的内部来修改函数的参数值,函数结束之后,这些变量的值在如何变化呢? 给函数传递值有2种:1种是值传递,1种是引用传递 # 改变函数参数的值 # 值传递(数值.字符串.布尔 这些都是值传递) 在函数的内部修改变量值,不改变原参数定义的参数值,解释为: 这个在函数中不会改变原来定义(函数外部)的值 这是因为函数里面会有一个占的概念,外边的变量的值会复制给 占 里面,

【C语言天天练(四)】可变参数函数

可变参数函数指可以接受可变数量参数的函数.比如printf函数就是一个可变参数函数. 要完成可变参数函数的编写,需要用到定义于stdarg.h头文件中的一个类型va_list和三个宏va_start.va_arg.va_end. 注意: 1.可变参数必须从头到尾按照顺序逐个访问.如果在访问几个可变参数后想半途中止,这是可以的.但是,如果想一开始就访问列表中的参数,那是不行的. 2.由于参数列表中的可变参数部分并没有原型,所以,所有作为可变参数传递给函数的值都将执行缺省参数类型提升. 3.参数列表

娓娓道来c指针 (8)开发可变参数函数

(8)开发可变参数函数 在c语言中,可变参数的函数极其常见,如常用的printf().可变参数函数的一般形式如下: 返回值类型 函数名(类型1 参数1,类型2 参数2,...类型n 参数n,...); 如上所示,这是一个典型的可变参数样式,它共有n个确定的参数,最后的...表示可变参数的含义.必须指出...必须位于最后,并且它至少要有一个确定的参数,原因后面陈述. 为了开发可变参数的函数,需用到头文件stdarg.h.下面共给出两个实例,在实例中详细解释用法.一是求可变个整数的和:二是模仿pri