欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2195|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

用C語言實現(xiàn)參數(shù)個數(shù)可變的函數(shù)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:107189 發(fā)表于 2016-3-6 02:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
 采用C語言編程的時候,函數(shù)中形式參數(shù)的數(shù)目通常是確定的,在調(diào)用時要依次給出與形式參數(shù)對應(yīng)的所有實際參數(shù)。但在某些情況下希望函數(shù)的參數(shù)個數(shù)可以根據(jù)需要確定。典型的例子有大家熟悉的函數(shù)printf()、scanf()和系統(tǒng)調(diào)用execl()等。那么它們是怎樣實現(xiàn)的呢?

  C編譯器通常提供了一系列處理這種情況的宏,以屏蔽不同的硬件平臺造成的差異,增加程序的可移植性。這些宏包括va—start、va—arg和va—end等。

  使用這些宏有兩種不同的形式,二者在程序中包括的頭文件不同,宏的定義也存在一些差別。這兩種方式對應(yīng)的頭文件和宏的聲明見表1。

  采用ANSI標(biāo)準(zhǔn)形式時,參數(shù)個數(shù)可變的函數(shù)的原型聲明是:

  type funcname(type para1, type para2, ...)

  這種形式至少需要一個普通的形式參數(shù),后面的省略號不表示省略,而是函數(shù)原型的一部分,type是函數(shù)返回值和形式參數(shù)的類型。

  采用與UNIX System V兼容的聲明方式時,參數(shù)個數(shù)可變的函數(shù)原型是:

  type funcname(va—alist)

  va—dcl

  這種形式不需要提供任何普通的形式參數(shù),type是函數(shù)返回值的類型。va—dcl是對函數(shù)原型聲明中參數(shù)va—alist的詳細聲明,實際是一個宏定義,對不同的硬件平臺采用不同的類型來定義,但在最后都包括了一個分號,因此va—dcl后不再需要加上分號了。va—dcl在代碼中必須原樣給出,va—alist在VC中可以原樣給出,也可以略去,但在UNIX上的CC或Linux上的GCC中都要省略掉。此外,采用頭文件stdarg.h編寫的程序是符合ANSI標(biāo)準(zhǔn)的,可以在各種操作系統(tǒng)和硬件上運行,而采用頭文件varargs.h的方式僅僅是為了與以前的程序兼容。所以建議大家使用前者。兩種方式的基本原理是一致的,只是在語法形式上有一些細微的區(qū)別。以下主要就前一種方式對參數(shù)的處理做出說明。

  va—start使argp指向第一個可選參數(shù)。va—arg返回參數(shù)列表中的當(dāng)前參數(shù)并使argp指向參數(shù)列表中的下一個參數(shù)。va—end把argp指針清為NULL。函數(shù)體內(nèi)可以多次遍歷這些參數(shù),但是都必須以va—start開始,并以va—end結(jié)尾。

  調(diào)用者在實際調(diào)用參數(shù)個數(shù)可變的函數(shù)時,要通過一定的方法指明實際參數(shù)的個數(shù),例如把最后一個參數(shù)置為空字符串(系統(tǒng)調(diào)用execl()就是這樣的)、-1或其他的方式。

  下面給出一個具體的例子,前一部分是采用了符合ANSI標(biāo)準(zhǔn)形式的代碼,后一部分是采用了與UNIX System V兼容方式的代碼。代碼中加了一些注釋,這里就不再解釋了。該例子已經(jīng)在VC/Windows NT4.0、CC/AIX4.3.2.0、GCC/Redhat Linux 6.0環(huán)境下編譯并正常運行。

  1.演示如何使用參數(shù)個數(shù)可變的函數(shù),采用ANSI標(biāo)準(zhǔn)形式

  #include 〈stdio.h〉

  #include 〈string.h〉

  #include 〈stdarg.h〉

  / 函數(shù)原型聲明,至少需要一個確定的參數(shù),注意括號內(nèi)的省略號 /

  int demo( char , ... );

  void main( void )

  {

   demo(″DEMO″, ″This″, ″is″, ″a″, ″demo!″, ″″);

  }

  / ANSI標(biāo)準(zhǔn)形式的聲明方式,括號內(nèi)的省略號表示可選參數(shù) /

  int demo( char msg, ... )

  {

  va—list argp;

  / 定義保存函數(shù)參數(shù)的結(jié)構(gòu) /

  int argno = 0; / 紀(jì)錄參數(shù)個數(shù) /

  char para;

  / 存放取出的字符串參數(shù) /

  / argp指向傳入的第一個可選參數(shù),msg是最后一個確定的參數(shù) /

  va—start( argp, msg );

  while (1) {

  para = va—arg( argp, char );

  / 取出當(dāng)前的參數(shù),類型為char . /

   if ( strcmp( para, ″″) == 0 )

  / 采用空串指示參數(shù)輸入結(jié)束 /

  break;

  printf(″Parameter #%d is: %s\n″, argno, para);

   argno++;

  }

   va_end( argp );

   / 將argp置為NULL /

    return 0;

  }

  2.演示如何使用參數(shù)個數(shù)可變的函數(shù),采用與UNIX System V兼容的方式

  #include 〈stdio.h〉

  #include 〈string.h〉

  #include 〈varargs.h〉

  / 函數(shù)原型聲明,括號內(nèi)的類型va—list在VC/Windows NT4.0可以保留,但在AIX和Linux下需要去掉,即改成int demo( ) /

  int demo( va—list );

  void main( void )

  {

   demo(″This″, ″is″, ″a″, ″demo!″, ″″);

  }

  / UNIX System V采用的聲明方式,括號內(nèi)是va—alist,不是va—list,而且va—dcl后面不需要分號 /

  int demo( va—alist )

  va—dcl  

  {

  va—list argp;

   / 定義保存函數(shù)參數(shù)的結(jié)構(gòu) /

     int argno = 0; / 紀(jì)錄參數(shù)個數(shù) /

     char para;

  / 存放取出的字符串參數(shù) /

  va—start( argp );

  / argp指向第一個可選參數(shù) /

  while (1) {

  para = va—arg( argp, char );

  / 取出當(dāng)前的參數(shù),類型為char /

     if ( strcmp( para, ″″) == 0 )

  / 采用空串指示參數(shù)輸入結(jié)束 /

     break;

     printf(″Parameter #%d is: %s\n″, argno, para);

     argno++;

     }

  va_end( argp ); / 將argp置為NULL /

  return 0;

  }
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表