當前位置:首頁 » 編程語言 » c語言valist
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言valist

發布時間: 2022-10-23 15:26:37

『壹』 va_list是什麼變數結構在哪個頭文件定義的

頭文件為#include 〈stdarg.h〉,是在c語言中解決變參問題的一組宏。
在函數體中聲明一個va_list,然後用va_start函數來獲取參數列表中的參數,使用完畢後調用va_end()結束。
有些庫中va_list實現為char* 指針,可變參數的函數原理其實很簡單,而VA系列是以宏定義來定義的,實現跟堆棧相關。

『貳』 【求解釋va_list、va_start、va_arg、va_end】

這些都C定義的一些宏
獲取省略號指定的參數: 在函數體中聲明一個va_list,然後用va_start函數來獲取參數列表中的參數,使用完畢後調用va_end()結束。
va_start使arg_ptr指向第一個可選參數。
va_arg返回參數列表中的當前參數並使arg_ptr指向參數列表中的下一個參數。
va_end把arg_ptr指針清為NULL。
函數體內可以多次遍歷這些參數,但是都必須以va_start開始,並以va_end結尾。

『叄』 C語言關於文件中va_list的問題

不確定參數個數的函數要用省略號方式寫
void error_msg(char *format,...)

『肆』 ...的C語言中的元運算符

可變參數函數(Variadic functions)是stdarg.h內容典型的應用,雖然也可以使用在其他由可變參數函數調用的函數(例如,vprintf)。 可變參數函數的參數數量是可變動的,它使用省略號來忽略之後的參數。例如printf函數一般。代表性的聲明為:
int check(int a, double b, ...);
可變參數函數最少要有一個命名的參數,所以
char *wrong(...);
在C中是不被允許的(在C++中,這樣的聲明是合理的)。C中,省略符號之前必須要有逗號;而在C++中,則沒有這種強制要求。 使用相同的語法來定義: longfunc(char,double,int,...);longfunc(chara,doubleb,intc,...){/*...*/}//在C的舊形式中可能會出現較省略的函數定義:longfunc();chara;doubleb;longfunc(a,b,c,...){/*...*/}訪問未命名的參數,首先必須在可變參數函數中聲明va_list類型的變數。調用va_start並傳入兩個參數:第一個參數為va_list類型的變數,第二個為省略號前最後一個有名字的參數的名稱,接著每一調用va_arg就會返回下一個參數,va_arg的第一個參數為va_list,第二個參數為返回的類型。最後va_end必須在函數返回前被va_list調用(va_list當作參數)(沒有要求要讀取完所有參數)。
C99提供額外的宏,va_,它能夠復制va_list。而va_(va2, va1)函數作用為拷貝va1到va2。
沒有機制定義該怎麼判別傳遞到函數的參數量或者數據類型。函數通常需要知道或確定它們變化的方法。共通的慣例包含:
使用printf或scanf類的格式化字串來嵌入明確指定的類型。
在可變參數最後的標記值(sentinel value)。
總數變數來指明可變參數的數量。

『伍』 C語言 函數變參數的問題(va_list,va_start,va_arg,va_end)

va_start (ap, num);
這句話用錯了,va_start 是用來初始化ap的,num應該改為傳遞的第一個對象,也就是item。
loc_item = va_arg(ap,Item);
這句的作用是loc_item 被賦給ap的下一對象的值。
#include <stdio.h>
#include <stdarg.h>

typedef struct item
{
char name[20];
char kind[20];
}Item;

void showname (Item locitem,...);

void main ()
{
Item locitem1 = {"aaa","aaa"};
Item locitem2 = {"bbb","bbb"};
showname (locitem1,locitem2);
}

void showname (Item item,...)
{
va_list ap;
Item loc_item;

va_start (ap, item);//修改了這里
loc_item = va_arg(ap,Item);

printf("%s is %s\n",loc_item.name,loc_item.kind);
printf("other:%s is %s\n",item.name,item.kind);
va_end (ap);
}
顯示結果為:
bbb is bbb
other:aaa is aaa

『陸』 c語言如何封裝一個帶有可變參數的方法

需要借用C語言的VA_LIST宏定義,及相關操作來實現可變參數。

VA_LIST所在頭文件:#include <stdarg.h>,用法如下:

(1)首先在函數里定義一具VA_LIST型的變數,這個變數是指向參數的指針;

(2)然後用VA_START宏初始化剛定義的VA_LIST變數;

(3)然後用VA_ARG返回可變的參數,VA_ARG的第二個參數是你要返回的參數的類型(如果函數有多個可變參數的,依次調用VA_ARG獲取各個參數);

(4)最後用VA_END宏結束可變參數的獲取。

以下是一個自定義列印介面的實現:

intmy_printf(constchar*fmt,...)//...表示參數可變
{
va_listargs;//定義va_list
staticchargc_PrintfOutBuff[1000];
va_start(args,fmt);//初始化
vsnprintf((char*)gc_PrintfOutBuff,1000,(char*)fmt,args);//這里沒有使用VA_ARG取回單個變數,而是借用vsnprinf一次性讀取。
va_end(args);//結束獲取
puts("%s",(constchar*)gc_PrintfOutBuff);//使用。
return0;
}

『柒』 typedef struct __va_list { void *__ap; } va_list什麼意思

定義va_list為結構體struct __va_list { void *__ap; }的名字。
因此,可以用
va_list astruct;
來定義,代替
struct __va_list astruct;

『捌』 C語言 函數變參數的問題(va_list,va_start,va_arg,va_end)

void showname (int num,...);//第一個參數最好存放參數個數
showname (2,locitem1,locitem2);//調用
void showname (int num,...)
{
va_list ap;
Item loc_item;
va_start (ap, num);
for(;num;num--){
loc_item = va_arg(ap,Item);
printf("%s is %s\n",loc_item.name,loc_item.kind);
}
va_end (ap);
}

va_start (ap, num);通過判斷num的長度來確定 變長參數列表裡第一個參數的地址
所以它判斷的不是num的值而是num所佔內存的大小