va_list va_start va_end va_arg 解决变参问题

时间:2022-09-03 19:33:14

解决参数个数不确定的问题。

头文件 #include<stdarg.h>

VA_LIST 是在C语言中解决变参问题的一组宏,用于获取不确定个数的参数。

#ifdef _M_ALPHA
typedef struct {
char *a0; /* pointer to first homed integer argument */
int offset; /* byte offset of next parameter */
} va_list;
#else
typedef char * va_list;
#endif
_M_ALPHA是指DEC ALPHA(Alpha AXP)架构。所以一般情况下va_list所定义变量为字符指针。
INTSIZEOF 宏,获取类型占用的空间长度,最小占用长度为int的整数倍:
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

VA_START宏,获取可变参数列表的第一个参数的地址(ap是类型为va_list的指针,v是可变参数最左边的参数):

#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )

VA_ARG宏,获取可变参数的当前参数,返回指定类型并将指针指向下一参数(t参数描述了当前参数的类型):

#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

VA_END宏,清空va_list可变参数列表:

#define va_end(ap) ( ap = (va_list)0 )

程序例子:

//.h

    FILE* stream;
//...
void print(YX_DebugLevel level, const char* format ...);
void print(const char* format ...);
//.cpp

//...

/**
* Prints the given message to stdout.
*/
void YX_Debug::print(const char* format ...) //函数1
{
if(debugLevel==D_DEBUGGING)
{
va_list ap;
va_start(ap, format);
vfprintf(stream, format, ap);
fprintf(stream, "\n");
va_end(ap);
fflush(stream);
}
} void YX_Debug::print(YX_DebugLevel level, const char* format ...) //函数2
{
if(debugLevel>=level)
{
va_list ap;
va_start(ap, format);
vfprintf(stream, format, ap);
fprintf(stream, "\n");
va_end(ap);
fflush(stream);
}
} //... print( D_NOTHING, "YX_DEBUG::setLevel(%d)", level); //调用函数2
print( D_CRITICAL, "YX_DEBUG: Critical"); //调用函数2
print("[%X] %c", text.at(i).unicode(), text.at(i).toLatin1());//调用函数1

va_list va_start va_end va_arg 解决变参问题的更多相关文章

  1. 深入C语言可变参数&lpar;va&lowbar;arg&comma;va&lowbar;list&comma;va&lowbar;start&comma;va&lowbar;end&comma;&lowbar;INTSIZEOF&rpar;

    一.什么是可变参数 在C语言编程中有时会遇到一些参数个数可变的函数,例如printf(),scanf()函数,其函数原型为: int printf(const char* format,…),int ...

  2. 对va&lowbar;list&semi; va&lowbar;start &semi; va&lowbar;end &semi;vsprintf理解(转)

    以下为转载内容: int printf(const char* fmt, ...) { va_list args; int i; //1.将变参转化为字符串 va_start(args,fmt); v ...

  3. va&lowbar;list&sol;va&lowbar;start&sol;va&lowbar;arg&sol;va&lowbar;end深入分析【转】

    转自:http://www.cnblogs.com/justinzhang/archive/2011/09/29/2195969.html va_list/va_start/va_arg/va_end ...

  4. C 中va&lowbar;list&comma;va&lowbar;arg&comma;va&lowbar;start&comma;va&lowbar;end usage

    1.在学习c语言,难免会遇到多参函数,刚好c中也提供了一些机制:宏函数 #ifdef _M_ALPHA typedef struct { char *a0; /* pointer to first h ...

  5. va&lowbar;list 、va&lowbar;start、 va&lowbar;arg、 va&lowbar;end 使用说明【转】

    转自:https://blog.csdn.net/f110300641/article/details/83822290 在ANSI C中,这些宏的定义位于stdarg.h中: typedef cha ...

  6. 深度探索va&lowbar;start、va&lowbar;arg、va&lowbar;end

    采用C语言编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数.但在某些情况下希望函数的参数个数可以根据需要确定.典型的例子有大家熟悉的函数printf().s ...

  7. va&lowbar;start、va&lowbar;arg、va&lowbar;end、va&lowbar;copy 可变参函数

    1.应用与原理         在C语言中,有时我们无法给出一个函数参数的列表,比如: int printf(const char *format, ...); int fprintf(FILE *s ...

  8. C&plus;&plus;省略参数&lpar;va&lowbar;list va&lowbar;start va&lowbar;arg va&lowbar;end&rpar;的简单应用

    原文参考自:http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html #include <iostream> #in ...

  9. 对C语言中va&lowbar;list,va&lowbar;start,va&lowbar;arg和va&lowbar;end的一点理解

    这几个函数和变量是针对可变参数函数的,什么是可变参数函数呢,最经典的莫过于printf和scanf,这两个函数的声明如下: int printf(const char *format, ...); i ...

随机推荐

  1. 创建DirectInput接口对象说明---&lpar;void &ast;&ast;&rpar;&amp&semi;m&lowbar;pDI

    读别人代码时遇到的,起初没明白过来这是怎么回事,后来忽然想明白了. if (FAILED(DirectInput8Create(appInstance, DIRECTINPUT_VERSION, II ...

  2. 微信小程序教程(第一篇)

    目录 第一篇小程序概述 第二篇如何注册接入小程序及搭建开发环境 第三篇小程序的架构及实现机制,信道服务及会话管理 第四篇小程序开发基本框架及其限制与优化 第五篇小程序开发项目实例,测试及发布 .... ...

  3. &period;Net异步编程知多少

    1. 引言 最近在学习Abp框架,发现Abp框架的很多Api都提供了同步异步两种写法.异步编程说起来,大家可能都会说异步编程性能好.但好在哪里,引入了什么问题,以及如何使用,想必也未必能答的上来. 自 ...

  4. angular input 为file on-change 无效

    l转自:https://blog.csdn.net/klo220/article/details/53331229 侵删 出现这个问题是因为input的type是file,这时如果用ng-change ...

  5. urllib设置debuglevel打开调试开关

    1. 参考 Turning on debug output for python 3 urllib https://bugs.python.org/issue26892 Python爬虫入门四之Url ...

  6. how to check the computer is 32 bit or 64bit in linux

    just use cat /proc/cpuinfo in shell

  7. hdu 5099 简单模拟&lpar;比较型号&rpar;

    http://acm.hdu.edu.cn/showproblem.php?pid=5099 比较两个安卓手机型号,水题 注意点:A is actually implicit and usually ...

  8. 类的专有方法&lpar;&lowbar;&lowbar;getattr&lowbar;&lowbar;和&lowbar;&lowbar;setattr&lowbar;&lowbar;、&lowbar;&lowbar;delattr&lowbar;&lowbar;&rpar;

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #http://www.360doc.com/content/15/0413/19/12067640_4629 ...

  9. php中var&lowbar;dump、var&lowbar;export和print&lowbar;r的用法区别

    void var_dump ( mixed $expression [, mixed $... ] )此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值.数组将递归展开值,通过缩进显示其结 ...

  10. Android 中运行时权限获取联系人信息 Demo

    代码比较简单... AndroidManifest.xml <?xml version="1.0" encoding="utf-8"?> <m ...