国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C > 正文

C語(yǔ)言可變參數(shù)函數(shù)詳解示例

2020-01-26 15:42:35
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

先看代碼

復(fù)制代碼 代碼如下:

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

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

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

后面的三個(gè)點(diǎn)...表示printf參數(shù)個(gè)數(shù)是不定的.
如何實(shí)現(xiàn)可變參數(shù)函數(shù)?
2. 編寫(xiě)可變函數(shù)準(zhǔn)備
為了編寫(xiě)可變參數(shù)函數(shù),我們通常需要用到<stdarg.h>頭文件下定義的以下函數(shù):
復(fù)制代碼 代碼如下:

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是用于存放參數(shù)列表的數(shù)據(jù)結(jié)構(gòu)。
va_start函數(shù)根據(jù)初始化last來(lái)初始化參數(shù)列表。
va_arg函數(shù)用于從參數(shù)列表中取出一個(gè)參數(shù),參數(shù)類型由type指定。
va_copy函數(shù)用于復(fù)制參數(shù)列表。
va_end函數(shù)執(zhí)行清理參數(shù)列表的工作。
上述函數(shù)通常用宏來(lái)實(shí)現(xiàn),例如標(biāo)準(zhǔn)ANSI形式下,這些宏的定義是:
復(fù)制代碼 代碼如下:

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是為了按照整數(shù)字節(jié)對(duì)齊指針,因?yàn)閏調(diào)用協(xié)議下面,參數(shù)入棧都是整數(shù)字節(jié)(指針或者值)。
函數(shù)官方說(shuō)明,如果你看到英文就煩,可以自行忽略以下說(shuō)明。
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 主站蜘蛛池模板: 交口县| 南乐县| 双城市| 乐山市| 安西县| 双桥区| 桓仁| 准格尔旗| 青龙| 青阳县| 贺兰县| 汽车| 黑河市| 齐河县| 土默特左旗| 余姚市| 筠连县| 永定县| 农安县| 正宁县| 漳平市| 洛扎县| 松溪县| 红安县| 司法| 武冈市| 历史| 平山县| 广平县| 乌恰县| 若尔盖县| 会宁县| 临猗县| 宾川县| 武宁县| 龙陵县| 白山市| 上虞市| 望江县| 滕州市| 南靖县|