va start linux头文件,va_start/va_end函数-linux

news/2024/12/22 20:07:54/

#include

void va_start(va_list ap, last);

type va_arg(va_list ap, type);

void va_end(va_list ap);

void va_copy(va_list dest, va_list src);

1:当无法列出传递函数的所有实参的类型和数目时,可用省略号指定参数表

void foo(...);

void foo(parm_list,...);

2:函数参数的传递原理

函数参数是以数据结构:栈的形式存取,从右至左入栈.

eg:

#include

void fun(int a, ...)

{

int *temp = &a;

temp++;

for (int i = 0; i < a; ++i)

{

cout << *temp << endl;

temp++;

}

}

int main()

{

int a = 1;

int b = 2;

int c = 3;

int d = 4;

fun(4, a, b, c, d);

system("pause");

return 0;

}

Output::

1

2

3

4

3:获取省略号指定的参数

在函数体中声明一个va_list,然后用va_start函数来获取参数列表中的参数,使用完毕后调用va_end()结束。

4.va_start使argp指向第一个可选参数。va_arg返回参数列表中的当前参数并使argp指向参数列表中的下一个参数。va_end把argp指针清为NULL。函数体内可以多次遍历这些参数,但是都必须以va_start开始,并以va_end结尾。

实例:

编写vstart.c,如下:

//vstart.c

#include 

#include 

#include 

intdemo(char*fmt, ...);

intmain()

{

demo("DEMO","This","is","a","demo!","");

return0;

}

intdemo(char*fmt, ... )

{

va_list argp;

intargno = 0;

char*para;

va_start(argp, fmt);

while(1)

{

para = va_arg(argp, char*);

if(strcmp( para,"") == 0)

break;

printf("Parameter #%d is: %s/n", argno, para);

argno++;

}

va_end( argp );

return0;

}

编译运行:

[root@fly test]# gcc -o vstart vstart.c

[root@fly test]# ./vstart

Parameter #0 is: This

Parameter #1 is: is

Parameter #2 is: a

Parameter #3 is: demo!

[root@fly test]#

注意:va_arg()的格式:

type va_arg(va_list ap, type);

因此:

int d;

char c, *s;

d = va_arg(ap, int);   /* int */

c = (char) va_arg(ap, int);  /* char */

s = va_arg(ap, char *);   /* string */

实例2:(start.c)

#include 

#include 

#include 

intfoo(char*fmt, ...);

intmain()

{

char*a ="ast";

intb = 224;

charc ='x';

foo("%s,%d,%c/n",a,b,c);

return0;

}

intfoo(char*fmt, ...)

{

va_list ap;

intd;

charc, *s;

va_start(ap, fmt);

while(*fmt)

switch(*fmt++)

{

case's':/* string */

s = va_arg(ap, char*);

printf("string %s/n", s);

break;

case'd':/* int */

d = va_arg(ap, int);

printf("int %d/n", d);

break;

case'c':/* char */

/* need a cast here since va_arg only

takes fully promoted types */

c = (char) va_arg(ap,int);

printf("char %c/n", c);

break;

}

va_end(ap);

return0;

}

编译运行:

[root@fly test]# gcc -o start start.c

[root@fly test]# ./start

string ast

int 224

char x

[root@fly test]#

注意foo()格式:

foo("%s,%d,%c/n",a,b,c);


http://www.ppmy.cn/news/222247.html

相关文章

va_list语法

va_list &#xff08;1&#xff09;va_list类型&#xff0c;定义该类型变量来指向可变参数的地址。它的定义为&#xff1a; typedef char * va_list;&#xff08;2&#xff09;va_start(va_list, arg)&#xff0c;va_start初始化va_list变量&#xff0c;使得va_list变量指向…

MySQL 两个备机同时挂掉故障分析

来源&#xff1a; 接报线上出现两个5.7.38的备库同时crash&#xff0c;crash堆栈相同&#xff0c;内容如下&#xff1a; stack_bottom 7fd7700b0d30 thread_stack 0x40000 /home/service/app/mysql33066/bin/mysqld(my_print_stacktrace0x2c)[0xf1062c] /home/service/app/m…

Misumi米思米数据线驱动无法安装

Misumi米思米数据线驱动无法安装 • Win10 系统无法安装。 • 驱动只能在 XP 或 Win7 使用 • KCA-M538F-000 • M538F USB High Speed Serial Converter

Python 经纬度转化为米

import math from math import cosdef position_turn(Latitude,Longitude):参考地址&#xff1a;https://blog.csdn.net/Dust_Evc/article/details/102847870?utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-7.control&…

python任务:用米粒填充国际棋盘

1.代码如下&#xff1a; 先上图 2.代码如下&#xff1a; sum 0 for i in range(64): sum sum 2i print(’{}: {}’.format(i 1, 2i)) print(‘sum {}’.format(sum)) 3.运行结果&#xff1a;

红米手机安装google商店问题总结

①机型:redmi K30 Ultra, Android10 ②用什么工具&#xff1f; Go 安装器 ③go安装器安装google商店&#xff0c;显示“需安装应用过多” 去浏览器手动下&#xff0c;google商店 ④google play商店登录时显示“此账号已在此设备” 账户与同步>删除当前输入的账号 ⑤…

Python:阿基米德棋盘放米问题

国王与数学家阿基米德下棋,在棋盘上放米&#xff0c;国王输了&#xff0c;国王问阿基米德要什么奖赏&#xff1f; 阿基米德对国王说&#xff1a; 我只要在棋盘上第一格放一粒米&#xff0c;第二格放二粒&#xff0c;第三格放四粒&#xff0c;第四格放十六粒……… 按这个倍增的…

平方米用计算机怎么打,平方米符号怎么打m2 ㎡平方米符号输入方法

平方米符号多用于面积&#xff0c;在电脑中文字处理时有时候需要打㎡平方米符号&#xff0c;那么平方米符号怎么打m2 &#xff1f;其实很简单&#xff0c;下面小编给大家介绍比较简单的几种方法。 方法一&#xff1a;输入法直接输入 其实很多朋友电脑中都安装有搜狗输入法或QQ输…