深入解析C語言變長引數列表

2021-09-30 06:28:03 字數 1655 閱讀 1347

1:當無法列出傳遞函式的所有實參的型別和數目時,可用省略號指定參數列

void foo(...);

void foo(parm_list,...);

2:函式引數的傳遞原理

函式引數是以資料結構:棧的形式訪問,從右至左入棧.eg:

#include

void fun(int a, ...) }

int main()

output::

1 2 3 4

3:獲取省略號指定的引數

在函式體中宣告乙個va_list,然後用va_start函式來獲取引數列表中的引數,使用完畢後呼叫va_end()結束。像這段**:

void testfun(char* pszdest, int destlen, const char* pszformat, ...)

4.va_start使argp指向第乙個可選引數。va_arg返回引數列表中的當前引數並使argp指向引數列表中的下乙個引數。va_end把argp指標清為null。函式體內可以多次遍歷這些引數,但是都必須以va_start開始,並以va_end結尾。

1).演示如何使用引數個數可變的函式,採用ansi標準形式

#include 〈stdio.h〉

#include 〈string.h〉

#include 〈stdarg.h〉

/*函式原型宣告,至少需要乙個確定的引數,注意括號內的省略號*/

int demo( char, ... );

void main( void )

/*ansi標準形式的宣告方式,括號內的省略號表示可選引數*/

int demo( char msg, ... )

va_end( argp );

/*將argp置為null*/

return 0;

}2)//示例**1:可變引數函式的使用

#include "stdio.h"

#include "stdarg.h"

void ******_va_fun(int start, ...)

while(nar**alue != -1);               

return;

}int main(int argc, char* ar**)

3)//示例**2:擴充套件——自己實現簡單的可變引數的函式。

下面是乙個簡單的printf函式的實現,參考了中的例子

#include "stdio.h"

#include "stdlib.h"

void myprintf(char* fmt, ...)        //乙個簡單的類似於printf的實現,//引數必須都是int 型別

else

parg += sizeof(int);               //等價於原來的va_arg,前面假設都是int型別

}++fmt;

}while (*fmt != '/0');

parg = null;                               //等價於va_end

return;

}int main(int argc, char* ar**)

python變長引數列表 可變長引數

可變長引數 預設情況下,必須使用正確數量的引數呼叫函式,這意味著,如果您的函式需要2個引數,則必須使用2個引數 不多也不少 來呼叫函式。示例,該函式需要2個引數,並獲得2個引數 def my function fname,lname print fname lname my function emi...

變長引數列表函式

可變引數列表 標頭檔案提供了遍歷未知數目和型別的函式引數表的功能。該標頭檔案的實現因不同的機器而不同,但提供的介面是一致的。假定函式 f 帶有可變數目的實際引數,lastarg 是它的最後乙個命名的形式引數 引數列表必須至少包括乙個命名引數 那麼,在函式 f 內宣告乙個型別為 va list 的變數...

變長引數列表函式

可變引數列表 標頭檔案提供了遍歷未知數目和型別的函式引數表的功能。該標頭檔案的實現因不同的機器而不同,但提供的介面是一致的。假定函式 f 帶有可變數目的實際引數,lastarg 是它的最後乙個命名的形式引數 引數列表必須至少包括乙個命名引數 那麼,在函式 f 內宣告乙個型別為 va list 的變數...