1:當無法列出傳遞函式的所有實參的型別和數目時,可用省略號指定參數列
void foo(...);
void
foo(parm_list,...);
2:函式引數的傳遞原理
函式引數是以資料結構:棧的形式訪問,從右至左入棧.eg:
#include
void fun(int a, ...)
}int main()
output::12
343:獲取省略號指定的引數
在函式體中宣告乙個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 )
int demo( char msg, ...
)va_end( argp );
return 0;
}2)//示例**1:可變引數函式的使用
#include "stdio.h"
#include "stdarg.h"
void
******_va_fun(int start, ...)
while(nargvalue !=
-1);
return;
}int main(int argc, char* argv)
3)//示例**2:擴充套件——自己實現簡單的可變引數的函式。
下面是乙個簡單的printf函式的實現,參考了中的例子
#include "stdio.h"
#include "stdlib.h"
void
myprintf(char* fmt, ...)
//乙個簡單的類似於printf的實現,//引數必須都是int 型別
else
parg +=
sizeof(int);
//等價於原來的va_arg
}++fmt;
}while (*fmt != '\0');
parg =
null;
//等價於va_end
return;
}int main(int argc, char*
argv)
**:
c語言可變引數
ifdef debug print info x printk x,else print info x endif 一 什麼是可變引數 我們在c語言程式設計中有時會遇到一些引數個數可變的函式,例如printf 函式,其函式原型為 int printf const char format,它除了有乙個...
C語言可變引數
在gnu c中,巨集可以接受可變數目的引數,就象函式一樣,例如 1 2 define pr debug fmt,arg.printk kern debug fmt,arg 用可變引數巨集 variadic macros 傳遞可變參數列 你可能很熟悉在函式中使用可變參數列,如 1 voidprintf...
c語言 可變引數
c 語言 可變引數 宗旨 技術的學習是有限的,分享的精神是無限的。1 目前為止,見過比較熟悉的可變引數的函式就是 printf 函式 cpp view plain copy print?intprintf const char format,font family arial,helvetica,s...