va_list arg_ptr:定義乙個指向個數可變的引數列表指標;
va_start(arg_ptr, argn):使引數列表指標arg_ptr指向函式引數列表中的第乙個可選引數,說明:argn是位於第乙個可選引數之前的固定引數,(或者說,最後乙個固定引數;…之前的乙個引數),函式引數列表中引數在記憶體中的順序與函式宣告時的順序是一致的。如果有一va函式的宣告是void va_test(char a, char b, char c, …),則它的固定引數依次是a,b,c,最後乙個固定引數argn為c,因此就是va_start(arg_ptr, c)。
va_arg(arg_ptr, type):返回引數列表中指標arg_ptr所指的引數,返回型別為type,並使指標arg_ptr指向引數列表中下乙個引數。
va_copy(dest, src):dest,src的型別都是va_list,va_copy()用於複製引數列表指標,將dest初始化為src。
va_end(arg_ptr):清空引數列表,並置引數指標arg_ptr無效。說明:指標arg_ptr被置無效後,可以通過呼叫va_start()、va_copy()恢復arg_ptr。每次呼叫va_start() / va_copy()後,必須得有相應的va_end()與之匹配。引數指標可以在引數列表中隨意地來回移動,但必須在va_start() … va_end()之內。
◎用法:
func( type para1, type para2, type para3, ... )
◎研究:
typedef char * va_list;
#define va_start _crt_va_start
#define va_arg _crt_va_arg
#define va_end _crt_va_end
#define _crt_va_start(ap,v) ( ap = (va_list)_addressof(v) + _intsizeof(v) )
#define _crt_va_arg(ap,t) ( *(t *)((ap += _intsizeof(t)) - _intsizeof(t)) )
#define _crt_va_end(ap) ( ap = (va_list)0 )
va_list argptr;
c語言的函式是從右向左壓入堆疊的,呼叫va_start後,
按定義的巨集運算,_addressof得到v所在的位址,然後這個
位址加上v的大小,則使ap指向第乙個可變引數如圖:
棧底 高位址
| .......
| 函式返回位址
| .......
| 函式最後乙個引數
| ....
| 函式第乙個可變引數 <--va_start後ap指向
| 函式最後乙個固定引數
| 函式第乙個固定引數
棧頂 低位址
通過可變引數實現可變引數的專案日誌輸出
需包含標頭檔案標頭檔案
#ifndef log_printf_h
#define log_printf_h
#include #include #include #define isprintf 1
#define logfile "d:\\projectlog.txt"
bool logprintf(const char* pformat,...)
else
return false;
}#endif
使用
#include "logprintf.h"
#include using namespace std;
#define isprintf 0 //定義是否列印
int main()
可變參列表
在可變引數列表中,我們在沒有對應的引數表示符時,如何獲取引數列表,在可變引數列表中我們,只有 所以通過標示符得到是不可能的,於是我們只好尋找另一種方式去獲取,我們知道函式在呼叫時都會返回位址,引數,等壓入到分配的棧空間中。引數的入棧順序會取決於你的呼叫約定,如stdcall cd call fast...
可變引數 函式 可變引數列表 1
我們在c語言程式設計中有時會遇到一些引數個數可變的函式,即函式的入參個數和型別是不確定的,例如printf 函式,其函式原型為 int printf char format,它除了有乙個引數format固定以外,後面跟的引數的個數和型別是可變的 用三個點 做引數佔位符 實際呼叫時可以有以下的形式 p...
可變引數列表函式實現
如題 我們在寫可變引數列表函式之前,先來了解一下什麼是可變引數列表函式。我們在c語言程式設計中有時會遇到 一些引數個數可變的函式,例如printf 函式,其函式原型為 int printf const char format,它除了有乙個引數format固定以外,後面跟的引數個數和型別是可變的 用三...