ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

ÆÊÎö±ä³¤²ÎÊýº¯ÊýµÄʵÏÖ
2013-11-20 14:24:38 À´Ô´: ×÷Õß: ¡¾´ó ÖРС¡¿ ä¯ÀÀ:171´Î
Tags£ºÆÊÎö ²ÎÊýº¯Êý ʵÏÖ

    ʲôÊ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.

¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
·ÖÏíµ½: 
ÉÏһƪ£ºC++Ö¸Ïòº¯ÊýµÄÖ¸Õë ÏÂһƪ£ºC/C++ sizeof ×ܽá

ÆÀÂÛ

ÕÊ¡¡¡¡ºÅ: ÃÜÂë: (ÐÂÓû§×¢²á)
Ñé Ö¤ Âë:
±í¡¡¡¡Çé:
ÄÚ¡¡¡¡ÈÝ:

¡¤Linuxϵͳ¼ò½é (2025-12-25 21:55:25)
¡¤Linux°²×°MySQL¹ý³Ì (2025-12-25 21:55:22)
¡¤Linuxϵͳ°²×°½Ì³Ì£¨ (2025-12-25 21:55:20)
¡¤HTTP Åc HTTPS µÄ²î„ (2025-12-25 21:19:45)
¡¤ÍøÕ¾°²È«±ØÐ޿ΣºÍ¼ (2025-12-25 21:19:42)