建体彩网|中彩网双色球连号|
?
快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

和記娛樂和記怡情AG:C語言中可變參數的用法

?

我們在C說話編程中會碰到一些參數個數可變的函數,例如printf()

這個函數,它的定義是這樣的:

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

它除了有一個參數for和記娛樂和記怡情AGmat固定以外,后面跟的參數的個數和類型是可變的,例如我們可以有以下不合的調用措施:

printf("%d",i);

printf("%s",s);

printf("the  number  is  %d  ,string  is:%s",  i,  s);

究竟若何寫可變參數的C函數以及這些可變參數的函數編譯器是若何實現的呢?本文就這個問題進行一些探究,和記娛樂和記怡情AG盼望能對大年夜家有些贊助.會C++的網友知道這些問題在C++里不存在,由于C++具有多態性.但C++是C的一個超集,以下的技巧也可以用于C++的法度榜樣中.限于本人的水平,文中假如有 欠妥之處,請大年夜家斧正.

(一)寫一個簡單的可變參數的C函數

下面我們來探究若何寫一個簡單的可變參數的C函數.寫可變參數的C函數要在法度榜樣頂用到以下這些宏:

void  va_start(  va_list  arg_ptr,  prev_param  );

type  va_arg(  va_list  arg_ptr,  type  );

void  va_end(  va_list  arg_ptr  );

va在這里是variable-argument(可變參數)的意思. 這些宏定義在stdarg.h中,以是用到可變參數的法度榜樣應該包孕這個 頭文件.下面我們寫一個簡單的可變參數的函數,改函數至少有一個整數參數,第二個參數也是整數,是可選的.函數只是打印這兩個參數的值.

void  simple_va_fun(int  i,  ...)

{

va_list  arg_ptr;

int  j=0;

va_start(arg_ptr,  i);

j=va_arg(arg_ptr,  int和記娛樂和記怡情AG);

va_end(arg_ptr);

printf("%d  %dn",  i,  j);

return;

}

我們可以在我們的頭文件中這樣聲明我們的函數:

extern  void  simple_va_fun(int  i,  ...);

我們在法度榜樣中可以這樣調用:

simple_va_fun(100);

simple_va_fun(100,200);

從這個函數的實現可以看到,我們應用可變參數應該有以下步驟:

1)首先在函數里定義一個va_list型的變量,這里是arg_ptr,這個變量是指向參數和記娛樂和記怡情AG的指針.

2)然后用va_start宏初始化變量arg_ptr,這個宏的第二個參數是第一個可變參數的前一個參數,是一個固定的參數.

3)然后用va_arg返回可變的參數,并賦值給整數j.  va_arg的第二 參數是你要返回的參數的類型,這里是int型.

4)著末用va_end宏停止可變參數的獲取.然后你就可以在函數里應用第二個參數了.假如函數有多個可變參數的,依次調用va_arg獲取各個參數.

假如我們用下面三種措施調用的話,都是合法的,但結果卻不一樣:

1)simple_va_fun(100);

結果是:100  -123456789(會變的值)

2)simple_va_fun(100,200);

結果是:100  200

3)simple_va_fun(100,200,300);

結果是:100  200

我們看到第一種調用有差錯,第二種調用精確,第三種調用只管結果精確,但和我們函數最初的設計有沖突.下面一節我們探究呈現這些結果的緣故原由和可變參數在編譯器中是若何處置懲罰的.

(二)可變參數在編譯器中的處置懲罰

我們知道va_start,va_arg,va_end是在stdarg.h中被定義成宏的, 因為1)硬件平臺的不合  2)編譯器的不合,以是定義的宏也有所不合,下面以VC++中stdarg.h里x86平臺的宏定義摘錄如下(’’號表示折行):

高地址|-----------------------------|

|函數返回地址  |

|-----------------------------|

|.......  |

|-----------------------------| void  simple_va_fun(int  i,  ...)

{

va_list  arg_ptr;

char  *s=NULL;

va_start(arg_ptr,  i);

s=va_arg(arg_ptr,  char*);

va_end(arg_ptr);

printf("%d  %sn",  i,  s);

return;

}

可變參數為char*型,當我們忘懷用兩個參數來調用該函數時,就會呈現和記娛樂和記怡情AGcore  dump(Unix)  或者頁面不法的差錯(window平臺).但也有可能不掉足,但差錯卻是難以發明,晦氣于我們寫出高質量的法度榜樣.

以下提一下va系列宏的兼容性.

System  V  Unix把va_start定義為只有一個參數的宏:

va_start(va_list  arg_ptr);

而ANSI  C則定義為:

va_start(va_list  arg_ptr,  prev_param);

假如我們要用system  V的定義,應該用vararg.h頭文件中所定義的宏,ANSI  C的宏跟system  V的宏是不兼容的,我們一樣平常都用ANSI  C,以是用ANSI  C的定義就夠了,也便于法度榜樣的移植.

小結:

可變參數的函數道理著實很簡單,而va系列因此宏定義來定義的,實現跟客棧相關.我們寫一個可變函數的C函數時,有利也有弊,以是在不需要的場合,我們無需用到可變參數.假如在C++里,我們應該使用C++的多態性來實現可變參數的功能,只管即便避免用C說話的要領來實現.

免責聲明:以上內容源自網絡,版權歸原作者所有,如有侵犯您的原創版權請告知,我們將盡快刪除相關內容。

您可能還會對下面的文章感興趣:

建体彩网
游乐场卖什么赚钱方便 三张牌游戏炸金花 体球网足球比分 ag电子能对刷的游戏 梦幻西游109和155那个赚钱多 捕鱼游戏手机 淘宝快3开奖 辽宁11选5复式投注 开元棋牌app在哪下载 排球比分直播网址