EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
C语言可变参数函数的使用方法讲解
x7 D0 z: l0 ?3 t* e
6 h1 N$ E! v! \$ p7 F
. ~/ j6 c; h# l9 _& N本文主要介绍可变参数的函数使用,然后分析它的原理,程序员自己如何对它们实现和封装,最后是可能会出现的问题和避免措施。 VA函数(variable argument function),参数个数可变函数,又称可变参数函数。C/C++编程中,系统提供给编程人员的va函数很少。*printf()/*scanf()系列函数,用于输入输出时格式化字符串;exec*()系列函数,用于在程序中执行外部文件(main(int argc,char*argv[]算不算呢,与其说main()也是一个可变参数函数,倒不如说它是exec*()经过封装后的具备特殊功能和意义的函数,至少在原理这一级上有 很多相似之处)。由于参数个数的不确定,使va函数具有很大的灵活性,易用性,对没有使用过可变参数函数的编程人员很有诱惑力;那么,该如何编写自己的va函数,va函数的运用时机、编译实现又是如何。作者借本文谈谈自己关于va函数的一些浅见。 一、 从printf()开始 从大家都很熟悉的格式化字符串函数开始介绍可变参数函数。 原型:int printf(const char * format, ...); 参数format表示如何来格式字符串的指令,… 表示可选参数,调用时传递给"..."的参数可有可无,根据实际情况而定。 系统提供了vprintf系列格式化字符串的函数,用于编程人员封装自己的I/O函数。 int vprintf / vscanf(const char * format, va_list ap); // 从标准输入/输出格式化字符串 int vfprintf / vfsacanf(FILE * stream, const char * format, va_list ap); // 从文件流 int vsprintf / vsscanf(char * s, const char * format, va_list ap); // 从字符串 // 例1:格式化到一个文件流,可用于日志文件 FILE *logfile; int WriteLog(const char * format, ...) { va_list arg_ptr; va_start(arg_ptr, format); int nWrittenBytes = vfprintf(logfile, format, arg_ptr); va_end(arg_ptr); return nWrittenBytes; } … // 调用时,与使用printf()没有区别。 WriteLog("%04d-%02d-%02d %02d:%02d:%02d %s/%04d logged out.", nYear, nMonth, nDay, nHour, nMinute, szUserName, nUserID); 同理,也可以从文件中执行格式化输入;或者对标准输入输出,字符串执行格式化。在上面的例1中,WriteLog()函数可以接受参数个数可变的输入,本质上,它的实现需要vprintf()的支持。如何真正实现属于自己的可变参数函数,包括控制每一个传入的可选参数。
5 g5 y$ l- u! _0 i/ } |