日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转载】c语言中的可变参数编程

發(fā)布時間:2025/3/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转载】c语言中的可变参数编程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在c語言中使用變長參數(shù)最常見的就是下面兩個函數(shù)了:

int printf(const char *format, ...);int scanf(const char *format, ...);

  那他們是怎樣實(shí)現(xiàn)支持變成參數(shù)的呢?在使用變長參數(shù)的函數(shù)(這里假設(shè)是func)實(shí)現(xiàn)部分其實(shí)用到了stdarg.h里面的多個宏來訪問那些不確定的參數(shù),它們分別是:

void va_start(va_list ap, last); type va_arg(va_list ap, type); void va_end(va_list ap);

  假設(shè)lastarg是func的最后一個具名參數(shù),即在func函數(shù)定義中...之前的那個參數(shù)(在printf中l(wèi)astarg是format),在func中首先定義一個變量:

va_list ap

  這個變量以后會依次指向各個可變參數(shù)。ap在使用之前必須用宏va_start初始化一次,如下所示:

va_start(ap, lastarg);

其中l(wèi)astarg是func中的最后一個具名參數(shù)。然后就可以用va_arg來獲得下一個不定參數(shù)(前提是知道這個不定參數(shù)的類型type):

type next = va_arg(ap, type)

  最后就是用宏va_end來清理現(xiàn)場。

  下面我們來自己實(shí)現(xiàn)一個可變參數(shù)的函數(shù):

1 #include <stdio.h>2 #include <stdarg.h>3 4 void func(char *fmt, ...)5 {6 va_list ap;7 8 va_start(ap, fmt);9 10 while (*fmt) 11 { 12 switch(*fmt) 13 { 14 case 'd': 15 fprintf(stdout, "%d\n", (int)va_arg(ap, int)); 16 break; 17 case 'c': 18 fprintf(stdout, "%c\n", (char)va_arg(ap, int)); 19 break; 20 case 's': 21 fprintf(stdout, "%s\n", (char *)va_arg(ap, char *)); 22 break; 23 default: 24 fprintf(stderr, "error fmt\n"); 25 } 26 fmt ++; 27 } 28 va_end(ap); 29 } 30 31 int main ( int argc, char *argv[] ) 32 { 33 func("dcs", 10, 's', "hello"); 34 return 0; 35 } /* ---------- end of function main ---------- */

  輸出結(jié)果:

10 s hello

  可以看到上面的程序完成按我們的意愿實(shí)現(xiàn)了變長參數(shù)的訪問,通過前面的fmt來控制下一個不定參數(shù)的類型。那這三個宏是怎樣實(shí)現(xiàn)對不定參數(shù)訪問的呢?下面來看看它們是怎么實(shí)現(xiàn)的:

  va_list實(shí)際就是一個指向各個不定參數(shù)的指針,由于參數(shù)的類型是不確定的,所以可以定義va_list為void *或者char *類型,即

#define va_list void *

  va_start就是將va_list指向函數(shù)最后一個具名參數(shù)lastarg后面的位置,這個位置就是第一個不定參數(shù)。

#define va_start(ap, lastarg) \ (ap = (va_list)&lastarg + sizeof(lastarg))

  va_arg獲取當(dāng)前不定參數(shù)的值,根據(jù)當(dāng)前參數(shù)的類型的大小移動指針指向下一個不定參數(shù)。

#define va_arg(ap, type) \ (*(type *)((ap += sizeof(type)) - sizeof(type)))

  va_end將指針清0。

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

  本質(zhì)上其實(shí)就是靠前面lastarg來控制不定參數(shù)的類型,va_list變量來指向不定參數(shù)的地址,然后根據(jù)lastarg一個一個的獲取不定參數(shù)。

轉(zhuǎn)載于:https://www.cnblogs.com/gildoringlorin/p/3965787.html

總結(jié)

以上是生活随笔為你收集整理的【转载】c语言中的可变参数编程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。