真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

c語言宏函數(shù)可變參數(shù) c++可變參數(shù)宏

C語言宏定義實現(xiàn)可變參數(shù)

__VA_ARGS__ 是一個可變參數(shù)的宏,這個可變參數(shù)的宏是新的C99規(guī)范中新增的。

創(chuàng)新互聯(lián)公司于2013年成立,先為安義等服務(wù)建站,安義等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為安義企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

GCC、VC2005開始支持。

#define CALCSUM(v, ...)? ?sum(v, __VA_ARGS__)

int sum(int num_args, ...)

{

int val = 0;

va_list ap;

int i;

va_start(ap, num_args);

for (i = 0; i num_args; i++)

{

val += va_arg(ap, int);

}

va_end(ap);

return val;

}

int main(void)

{

printf("10、20 和 30 的和 = %d\n", CALCSUM(3, 10, 20, 30));

printf("4、20、25 和 30 的和 = %d\n", CALCSUM(4, 4, 20, 25, 30));

return 0;

}

將函數(shù)定義成宏 參數(shù)類型怎樣設(shè)置

需要借用C語言的VA_LIST 宏定義,及相關(guān)操作來實現(xiàn)可變參數(shù)。VA_LIST 所在頭文件:#include stdarg.h,用法如下:(1)首先在函數(shù)里定義一具VA_LIST型的變量,這個變量是指向參數(shù)的指針;(2)然后用VA_START宏初始化剛定義的VA_LIST變量;(3)然后用VA_ARG返回可變的參數(shù),VA_ARG的第二個參數(shù)是你要返回的參數(shù)的類型(如果函數(shù)有多個可變參數(shù)的,依次調(diào)用VA_ARG獲取各個參數(shù));(4)最后用VA_END宏結(jié)束可變參數(shù)的獲取。以下是一個自定義打印接口的實現(xiàn):pre t="code" l="cpp"int my_printf(const char *fmt, )//表示參數(shù)可變

{

va_list args;//定義va_list

static char gc_PrintfOutBuff[1000];

va_start(args, fmt);//初始化

vsnprintf((char *) gc_PrintfOutBuff, 1000, (char *) fmt, args);//這里沒有使用VA_ARG取回單個變量,而是借用vsnprinf一次性讀取。

va_end(args);//結(jié)束獲取

puts("%s",(const char *)gc_PrintfOutBuff);//使用。

return 0;

}

c語言如何封裝一個帶有可變參數(shù)的方法?

需要借用C語言的VA_LIST?宏定義,及相關(guān)操作來實現(xiàn)可變參數(shù)。

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

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

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

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

(4)最后用VA_END宏結(jié)束可變參數(shù)的獲取。

以下是一個自定義打印接口的實現(xiàn):

int?my_printf(const?char?*fmt,?...)//...表示參數(shù)可變

{

va_list?args;//定義va_list

static?char?gc_PrintfOutBuff[1000];

va_start(args,?fmt);//初始化

vsnprintf((char?*)?gc_PrintfOutBuff,?1000,?(char?*)?fmt,?args);//這里沒有使用VA_ARG取回單個變量,而是借用vsnprinf一次性讀取。

va_end(args);//結(jié)束獲取

puts("%s",(const?char?*)gc_PrintfOutBuff);//使用。

return?0;

}

c語言中函數(shù)可否改變參數(shù)值

#include

void

foo(int

x,

int

y,

int

z)

{

printf("x

=

%d

at

[%x]n",

x,

x);

printf("y

=

%d

at

[%x]n",

y,

y);

printf("z

=

%d

at

[%x]n",

z,

z);

}

int

main(int

argc,

char

*argv[])

{

foo(100,

200,

300);

return

0;

}

運行結(jié)果:

x

=

100

at

[bfe28760]

y

=

200

at

[bfe28764]

z

=

300

at

[bfe28768]

c程序棧底為高地址,棧頂為低地址,因此上面的實例可以說明函數(shù)參數(shù)入棧順序的確是從右至左的??傻降诪槭裁茨??查了一直些文獻得知,參數(shù)入棧順序是和具體編譯器實現(xiàn)相關(guān)的。比如,pascal語言中參數(shù)就是從左到右入棧的,有些語言中還可以通過修飾符進行指定,如visual

c++.即然兩種方式都可以,為什么c語言要選擇從右至左呢?

進一步發(fā)現(xiàn),pascal語言不支持可變長參數(shù),而c語言支持這種特色,正是這個原因使得c語言函數(shù)參數(shù)入棧順序為從右至左。具體原因為:c方式參數(shù)入棧順序(從右至左)的好處就是可以動態(tài)變化參數(shù)個數(shù)。通過棧堆分析可知,自左向右的入棧方式,最前面的參數(shù)被壓在棧底。除非知道參數(shù)個數(shù),否則是無法通過棧指針的相對位移求得最左邊的參數(shù)。這樣就變成了左邊參數(shù)的個數(shù)不確定,正好和動態(tài)參數(shù)個數(shù)的方向相反。

因此,c語言函數(shù)參數(shù)采用自右向左的入棧順序,主要原因是為了支持可變長參數(shù)形式。換句話說,如果不支持這個特色,c語言完全和pascal一樣,采用自左向右的參數(shù)入棧方式

c語言如何定義一個可變參數(shù)函數(shù) 如何調(diào)用其輸入的參數(shù) 分別

有專門的宏,處理可變參

void va_start( va_list arg_ptr, prev_param );

type va_arg( va_list arg_ptr, type );

void va_end( va_list arg_ptr );

一個簡單的例子

void?simple_va_fun(int?i,?...)

{

va_list?arg_ptr;

int?j=0;

va_start(arg_ptr,?i);

j=va_arg(arg_ptr,?int);

va_end(arg_ptr);

printf("i=%d?j=%d\bn",?i,?j);

return;

}

int?main()

{

simple_va_fun(1);

simple_va_fun(1,2);

simple_va_fun(1,200);

return?0;

}

C語言中可變參數(shù)宏的va_start(ap, v)

你需要明白的是va_系列函數(shù)的實現(xiàn)原理是根據(jù)棧指針來進行定位不定參數(shù)的位置,然后根據(jù)你的需要(注意是根據(jù)你的需要,并不是檢測告訴你數(shù)據(jù)的類型與值),將數(shù)據(jù)的值給取出來。

所以va_start那里本質(zhì)是為了得到當(dāng)前的不定參數(shù)數(shù)據(jù)在棧中存放的位置指針,va_ap是根據(jù)你需要的類型(參數(shù)中傳入數(shù)據(jù)的類型),來得到所需要的數(shù)據(jù)。


分享文章:c語言宏函數(shù)可變參數(shù) c++可變參數(shù)宏
本文網(wǎng)址:http://weahome.cn/article/hpjohi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部