国产探花免费观看_亚洲丰满少妇自慰呻吟_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 主站蜘蛛池模板: 新安县| 米泉市| 祁东县| 城固县| 新蔡县| 和田县| 门头沟区| 弋阳县| 惠安县| 贵阳市| 新民市| 新化县| 股票| 双城市| 林州市| 张掖市| 长治县| 灵台县| 会东县| 广东省| 宁夏| 城固县| 凉山| 安陆市| 绥阳县| 东宁县| 周宁县| 华宁县| 满城县| 新乡市| 本溪| 五原县| 高阳县| 积石山| 红河县| 铜陵市| 南乐县| 宣威市| 广南县| 平远县| 尼勒克县|