c语言可变参数编程
来源:互联网 发布:佛山cnc编程招聘 编辑:程序博客网 时间:2024/04/26 19:41
---------------------------------------------我是分割线------------------------------------
<strong>INTSIZEOF</strong> 宏,获取类型占用的空间长度,最小占用长度为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 )
typedef char * va_list;
#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,t) \ ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )
#define va_end(ap) ( ap = (va_list)0 )
定义_INTSIZEOF(n)主要是为了某些需要内存的对齐的系统.C语言的函 数是从右向左压入堆栈的,这里的int必须是4的整数倍,内存对齐才有效。在实际使用的时候,必须自己定义最后结束的参数,不然程序只能返回下一个参数地址,然后强制转换成需要的类型,偏移对应的长度。
#include <stdarg.h>
#define MAXARGS 31
/*
* execl is called by
* execl(file, arg1, arg2, ..., (char *)(0));
*/
int
execl(
const
char
*file,
const
char
*args, ...)
{
va_list
ap;
char
*array[MAXARGS +1];
int
argno = 0;
va_start
(ap, args);
while
(args != 0 && argno < MAXARGS)
{
array[argno++] = args;
args =
va_arg
(ap,
const
char
*);
}
array[argno] = (
char
*) 0;
va_end
(ap);
return
execv(file, array);
}
---------------------------------------------我是分割线------------------------------------
vsprintf 函数定义如下:
int vsprintf(char *string, char *format, va_list param);
vsprintf 是sprintf 的一个变形,它只有三个参数。vsprintf 用于执行有不定数量参数的函数,类似printf 格式。vsprintf的前两个参数与sprintf相同:一个用于保存结果的字符串缓冲区和一个格式化字符串。第三个参数是指向格式化参数队列的指针。实际上,该指针指向在堆栈中供函数调用的变量。va_list、va_start和va_end宏(在STDARG.H中定义)帮助我们处理堆栈指针。本章最后的SCRNSIZE程式展示了使用这些宏的方法。使用vsprintf 函数,sprintf 函数可以这样编写:
int sprintf (char * szBuffer, const char * szFormat, ...)
{
int iReturn ;
va_list pArgs ;
va_start (pArgs, szFormat) ;
iReturn = vsprintf (szBuffer, szFormat, pArgs) ;
va_end (pArgs) ;
return iReturn ;
}
0 0
- C语言可变参数编程
- c语言可变参数编程
- C语言:可变参数编程
- C语言可变参数列表编程
- c语言可变参数
- C语言可变参数
- C语言可变参数
- C语言可变参数
- c语言可变参数
- c语言可变参数
- C语言可变参数
- C语言可变参数
- C语言可变参数
- c 语言可变参数
- c语言可变参数
- c语言 可变参数
- c语言可变参数 ...
- c语言可变参数
- PHPCMS V9的使用过程中问题笔记
- 再学Java进阶篇 数组与字符串
- Binary Tree Level Order Traversal II
- GitHub和SourceTree入门教程
- jquery,attr,prop,checkbox标签已有checked=checked但是不显示勾选
- c语言可变参数编程
- 关于c#入门经典第五版web编程中的跨页面传值问题
- solr-4.7.2目录和配置
- poj-3349 Snowflake Snow Snowflakes
- hduoj-1301 Jungle Roads(最小生成树-克鲁斯卡尔和普里姆求解)
- [leetcode-124]Binary Tree Maximum Path Sum(c++)
- 电脑桌面上的图标移动不了!.
- 360笔试--“找出第一个只出现一次的字符”
- leetcode 105: Construct Binary Tree from Preorder and Inorder Traversal