ʲôÊDZ䳤²ÎÊý£¿
Ëùνº¬Óб䳤²ÎÊýµÄº¯ÊýÊÇÖ¸¸Ãº¯Êý¿ÉÒÔ½ÓÊܿɱäÊýÄ¿µÄÐβΡ£ÀýÈçÎÒÃǶ¼·Ç³£ÊìϤµÄ printf,scanfµÈµÈ¡£
2:±ä³¤²ÎÊýÈçºÎʵÏÖ£¿
Ê×ÏÈÀ´¿´ÏÂÃæÕâÑùÒ»¸öÀý×Ó£º
#include<stdio.h>
#include<stdarg.h>
#include<string.h>
void demo£¨char *msg,¡£©
{
va_list argp;
int arg_number=0;
char *para = msg;
va_start£¨argp,msg£©£»
while£¨1£©
{
if £¨ strcmp£¨ para, "/0"£© != 0 £©
{
arg_number++;
printf£¨"parameter %d is: %s/n",arg_number,para£©£»
}
else
break;
para = va_arg£¨argp,char *£©£»
}
va_end£¨argp£©£»
}
int main£¨£©
{
demo£¨"Hello","World","/0"£©£»
system£¨"pause"£©£»
return 0;
}
ʵÏÖÕâÑùÒ»¸öº¯ÊýÒªÔÚÄÚ²¿Ê¹ÓÃva_list,va_start,va_arg,va_end,ÕâЩ¶¼ÊǶ¨ÒåÔÚ stdarg.hÖеĺꡣ
va_listÊǶ¨ÒåÁËÒ»¸ö±£´æº¯Êý²ÎÊýµÄÊý¾Ý½á¹¹¡£
va_start£¨argp,msg£©Êǽ«argpÖ¸ÏòµÚÒ»¸ö¿É±ä²ÎÊý£¬¶ømsgÊÇ×îºóÒ»¸öÈ·¶¨µÄ²ÎÊý¡£
×îºóÒ»¸öÈ·¶¨µÄ²ÎÊýµÄº¬ÒåÊÇÖ¸ËüÒÔºóµÄ²ÎÊý¶¼Êǿɱä²ÎÊý£¬Èç¹ûÓÐÏÂÃæµÄº¯ÊýÉùÃ÷
void demo£¨char *msg1,char *msg2,¡£©
ÄÇôÕâÀïµÄ×îºóÒ»¸öÈ·¶¨²ÎÊý¾ÍÊÇmsg2.
va_arg£¨argp,char *£©·µ»Øµ±Ç°²ÎÊýµÄÖµ£¬ÀàÐÍΪchar *,È»ºó½«argpÖ¸ÏòÏÂÒ»¸ö±ä³¤²Î Êý¡£´ÓÕâÒ»²½¿ÉÒÔ¿´³öÀ´ÎÒÃÇ¿ÉÒÔͨ¹ýva_startºÍva_arg±éÀúËùÓеı䳤²ÎÊý¡£
va_end ½«argpµÄÖµÖÃΪ0.
ÏÂÃæÎÒÃÇ¿´¿´ÉÏÊö¼¸¸öºêÔÚvisual c++.net 2003 ÖеÄʵÏÖ·½·¨¡£Ê×ÏÈÊÇva_listµÄʵÏÖ
#ifdef _M_ALPHA
typedef struct {
char *a0; /* pointer to first homed integer argument */
int offset; /* byte offset of next parameter */
} va_list;
#else
typedef char * va_list;
#endif
¿ÉÒÔ¿´µ½va_listʵ¼ÊÉÏÊÇÒ»¸ö»úÆ÷ÀàÐÍÏà¹ØµÄºê£¬³ýÁËalpha»úÆ÷ÒÔÍ⣬ÆäËû»úÆ÷ÀàÐͶ¼±»¶¨ÒåΪһ¸öcharÀàÐ͵ÄÖ¸Õë±äÁ¿£¬Ö®ËùÒÔ¶¨ÒåΪchar *ÊÇÒòΪ¿ÉÒÔÓøñäÁ¿ÖðµØÖ·Ò²¾ÍÊÇÖð×Ö½Ú¶Ô²ÎÊý½øÐбéÀú¡£
´ÓÉÏÃæ¿ÉÒÔ¿´µ½£¬ÕâЩºêµÄʵÏÖ¶¼ÊǺͻúÆ÷Ïà¹ØµÄ£¬ÏÂÃæÊÇ´ó¼Ò³£ÓõÄIX86»úÆ÷ϺêµÄÏà¹Ø¶¨Òå¡£
#elif defined£¨_M_IX86£©
#define _INTSIZEOF£¨n£© £¨ £¨sizeof£¨n£© + sizeof£¨int£© - 1£© & ~£¨sizeof£¨int£© - 1£© £©
#define va_start£¨ap,v£© £¨ ap = £¨va_list£©_ADDRESSOF£¨v£© + _INTSIZEOF£¨v£© £©
#define va_arg£¨ap,t£© £¨ *£¨t *£©£¨£¨ap += _INTSIZEOF£¨t£©£© - _INTSIZEOF£¨t£©£© £©
#define va_end£¨ap£© £¨ ap = £¨va_list£©0 £©
#ifdef __cplusplus
#define _ADDRESSOF£¨v£© £¨ &reinterpret_cast<const char &>£¨v£© £©
#else
#define _ADDRESSOF£¨v£© £¨ &£¨v£© £©
#endif
Ê×ÏÈ¿´_INTSIZEOF£¨n£©
ÎÒÃÇÖªµÀ¶ÔÓÚIX86,sizeof£¨int£©Ò»¶¨ÊÇ4µÄÕûÊý±¶£¬ËùÒÔ~£¨sizeof£¨int£© - 1£© £©µÄÖµÒ»¶¨ÊÇ
ÓÒÃæ[sizeof£¨n£©-1]/2λΪ0,Õû¸öÕâ¸öºêÒ²¾ÍÊDZ£Ö¤ÁËÓÒÃæ[sizeof£¨n£©-1]/2λΪ0,ÆäÓàλÖÃ
Ϊ1,ËùÒÔ_INTSIZEOF£¨n£©µÄÖµÖ»ÓпÉÄÜÊÇ2,4,8,16,¡¡µÈµÈ£¬Êµ¼ÊÉÏÊÇʵÏÖÁË×Ö½Ú¶ÔÆë¡£
#define va_start£¨ap,v£© £¨ ap = £¨va_list£©_ADDRESSOF£¨v£© + _INTSIZEOF£¨v£© £©
ËùÒÔva_start£¨ap,v£©µÄ×÷ÓþͺÜÃ÷ÁËÁË£¬_ADDRESSOF£¨v£©¶¨ÒåÁËvµÄÆðʼµØÖ·£¬_INTSIZEOF£¨v£©¶¨ÒåÁËvËù
Õ¼ÓõÄÄڴ棬ËùÒÔap ¾ÍÖ¸ÏòvºóÃæµÄ²ÎÊýµÄÆðʼµØÖ·¡£
#define va_arg£¨ap,t£© £¨ *£¨t *£©£¨£¨ap += _INTSIZEOF£¨t£©£© - _INTSIZEOF£¨t£©£© £©
ap += _INTSIZEOF£¨t£© ʹapÖ¸ÏòÁ˺óÃæÒ»¸ö²ÎÊýµÄµØÖ·
¶ø£¨ *£¨t *£©£¨£¨ap += _INTSIZEOF£¨t£©£© - _INTSIZEOF£¨t£©£© £©Ï൱ÓÚ·µ»ØÁËĿǰtÀàÐ͵IJÎÊýµÄÖµ¡£
#define va_end£¨ap£© £¨ ap = £¨va_list£©0 £©
½«±äÁ¿ap µÄÖµÖÃΪ0.
ͨ¹ýÉÏÊö·ÖÎö£¬ÔÙ´ÎÓ¡Ö¤ÁËÎÒÃ´Ç°Ãæ¶Ô¿É±ä²ÎÊýʵÏֵĽâÊÍ¡£
Òò´ËÎÒÃÇ¿ÉÒÔ×ܽá³ö±ä³¤²ÎÊýº¯ÊýµÄÒ»°ãʵÏÖ·½·¨£º
1:ÉùÃ÷ÔÐÍ£¬ÐÎÈçvoid demo£¨char *msg,¡£©£¬×¢Òâ±ä³¤²ÎÊýµÄÔÐÍÉùÃ÷ÖÐÖÁÉÙÒªº¬ÓÐ
Ò»¸öÈ·¶¨²ÎÊý¡£
2:ÓÃva_list¶¨Òå±£´æº¯Êý²ÎÊýµÄÊý¾Ý½á¹¹£¬¿ÉÒÔÀí½âΪһ¸öÖ¸Õë±äÁ¿£¨ÉÔºó»á½âÊÍ£©¡£
3:ÓÃva_start½«ÉÏÒ»²½¶¨ÒåµÄ±äÁ¿Ö¸ÏòµÚÒ»¸ö¿É±ä²ÎÊý¡£
4:ÓÃva_arg±éÀúËùÓеĿɱä²ÎÊý¡£
5:ÓÃva_end½«Ö¸Õë±äÁ¿³ÖÓеĵØÖ·ÖµÖÃΪ0.