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

首頁 > 學院 > 開發設計 > 正文

va_list 詳解

2019-11-10 23:31:21
字體:
來源:轉載
供稿:網友

本文的所有內容均來自http://www.cppblog.com/xmoss/archive/2009/07/20/90680.html,感謝此作者:)

VA_LIST 是在C語言中解決變參問題的一組宏

他有這么幾個成員:

1) va_list型變量:

#ifdef  _M_ALPHAtypedef struct {        char *a0;       /* pointer to first homed integer argument */        int offset;     /* byte offset of next parameter */} va_list;#elsetypedef char *  va_list;#endif

2)_INTSIZEOF 宏,獲取類型占用的空間長度,最小占用長度為int的整數倍:

#define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

3)VA_START宏,獲取可變參數列表的第一個參數的地址(ap是類型為va_list的指針,v是可變參數最左邊的參數):

#define va_start(ap,v)  ( ap = (va_list)&v + _INTSIZEOF(v) )

4)VA_ARG宏,獲取可變參數的當前參數,返回指定類型并將指針指向下一參數(t參數描述了當前參數的類型):

#define va_arg(ap,t)    ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) )

5)VA_END宏,清空va_list可變參數列表:

#define va_end(ap)      ( ap = (va_list)0 )

VA_LIST的用法:             (1)首先在函數里定義一具VA_LIST型的變量,這個變量是指向參數的指針;       (2)然后用VA_START宏初始化變量剛定義的VA_LIST變量;       (3)然后用VA_ARG返回可變的參數,VA_ARG的第二個參數是你要返回的參數的類型(如果函數有多個可變參數的,依次調用VA_ARG獲取各個參數);       (4)最后用VA_END宏結束可變參數的獲取。使用VA_LIST應該注意的問題:   (1)可變參數的類型和個數完全由程序代碼控制,它并不能智能地識別不同參數的個數和類型;   (2)如果我們不需要一一詳解每個參數,只需要將可變列表拷貝至某個緩沖,可用vsPRintf函數;   (3)因為編譯器對可變參數的函數的原型檢查不夠嚴格,對編程查錯不利.不利于我們寫出高質量的代碼;

小結:可變參數的函數原理其實很簡單,而VA系列是以宏定義來定義的,實現跟堆棧相關。我們寫一個可變參數的C函數時,有利也有弊,所 以在不必要的場合,我們無需用到可變參數,如果在C++里,我們應該利用C++多態性來實現可變參數的功能,盡量避免用C語言的方式來實現。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 特克斯县| 泸定县| 牙克石市| 拉萨市| 达州市| 花莲县| 西乌珠穆沁旗| 镇远县| 赣榆县| 东乌珠穆沁旗| 镇康县| 广平县| 江源县| 文成县| 古田县| 舒兰市| 金昌市| 梁山县| 乐陵市| 弋阳县| 宿迁市| 西乌珠穆沁旗| 大埔区| 盐亭县| 漠河县| 桑日县| 庆元县| 翁牛特旗| 泾源县| 方正县| 新干县| 治县。| 乃东县| 萨迦县| 黔江区| 逊克县| 临桂县| 昌黎县| 上犹县| 常宁市| 阜城县|