a亚洲精品_精品国产91乱码一区二区三区_亚洲精品在线免费观看视频_欧美日韩亚洲国产综合_久久久久久久久久久成人_在线区

首頁 > 編程 > C > 正文

C語言可變參數函數詳解示例

2020-01-26 15:42:35
字體:
來源:轉載
供稿:網友

先看代碼

復制代碼 代碼如下:

printf(“hello,world!”);其參數個數為1個。
printf(“a=%d,b=%s,c=%c”,a,b,c);其參數個數為4個。

如何編寫可變參數函數呢?我們首先來看看printf函數原型是如何定義的。
在linux下,輸入man 3 printf,可以看到prinf函數原型如下:
復制代碼 代碼如下:

SYNOPSIS
#include <stdio.h>
int printf(const char *format, ...);

后面的三個點...表示printf參數個數是不定的.
如何實現可變參數函數?
2. 編寫可變函數準備
為了編寫可變參數函數,我們通常需要用到<stdarg.h>頭文件下定義的以下函數:
復制代碼 代碼如下:

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);

其中:
va_list是用于存放參數列表的數據結構。
va_start函數根據初始化last來初始化參數列表。
va_arg函數用于從參數列表中取出一個參數,參數類型由type指定。
va_copy函數用于復制參數列表。
va_end函數執行清理參數列表的工作。
上述函數通常用宏來實現,例如標準ANSI形式下,這些宏的定義是:
復制代碼 代碼如下:

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是為了按照整數字節對齊指針,因為c調用協議下面,參數入棧都是整數字節(指針或者值)。
函數官方說明,如果你看到英文就煩,可以自行忽略以下說明。
va_start()
       The  va_start() macro initializes ap for subsequent use by va_arg() and
       va_end(), and must be called first.
       The argument last is the name of the last argument before the  variable
       argument list, that is, the last argument of which the calling function
       knows the type.
       Because the address of this argument may  be  used  in  the  va_start()
       macro,  it should not be declared as a register variable, or as a func 主站蜘蛛池模板: 新超碰97 | 干干干日日日 | 欧美在线视频播放 | 精品1区| 国产精品99精品久久免费 | 国产精品99久久久久久宅男 | 久久国产综合 | 区一区二区三在线观看 | 成人av免费看 | 久久精品久久久 | 99久久国产 | 中文字幕一区二区三区精彩视频 | 久草福利 | 日本在线一区二区 | 精品福利av导航 | 日韩欧美精品在线 | 91精品入口蜜桃 | 国产高清视频在线观看 | 日日操人人 | 欧美日在线 | 在线中文日韩 | а_天堂中文最新版地址 | 国产精品毛片一区二区三区 | 不卡视频一区二区 | 99国产精品99久久久久久 | 九九综合九九 | 国产成人在线免费看 | 免费精品视频在线观看 | 日韩视频在线免费观看 | 亚洲精品永久免费 | 精品一区二区不卡 | 亚洲成人精品av | 国产在线二区 | 亚洲最大免费视频 | 精品久久久久久久人人人人传媒 | 一区二区国产在线 | 久久777| 日本亚洲精品成人欧美一区 | 久久久精品国产 | 99免费在线观看视频 | 欧美成人精品一区 |