3952|0

4

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

【LEFT】C语言可变参数函数使用总结 [复制链接]

本帖最后由 辛昕 于 2018-9-6 22:06 编辑

//ADS1.2下编译使用
void TestFun(char* fmt,...)
{
    int ch;
    char selch = 0;
    va_list ap = NULL;
    va_start(ap, fmt);
    do
    {
        selch = *fmt;
        if (selch!='%')
        {
            putchar(*fmt);
        }
        else
        {
            selch = *++fmt;
            switch(selch)
            {
            case 'c':
                    ch = va_arg(ap, int);
                    printf("%c",ch);
                    break;
            case 'd':
                    ch = va_arg(ap,int);
                    printf("%d",ch);
                    break;
            case 'x':
                    ch = va_arg(ap, int);
                    printf("%#x",ch);
                    break;
            }
        }
        ++fmt;
    }while(*fmt!='\0');
    va_end(ap);   
   }

  //调用
   TestFun((char*)"this is %d,%c,%x",1234,'6',0x12345);
//WIN-TC编译通过
   #i nclude   
/************************************************************
typedef void    *va_list;
#define va_start(ap, parmN)    (ap = ...)
#define va_arg(ap, type)    (*((type *)(ap))++)
#define va_end(ap)
********************************************************************/
void TestFun(cosnt char* fmt,...)
{
    int ch;
    long i32value = 0;
    char selch = 0;
    va_list ap = 0;
    va_start(ap, fmt);
    do
    {
        selch = *fmt;
        if (selch!='%')
        {
            putch(*fmt);
        }
        else
        {
            selch = *++fmt;
            switch(selch)
            {
            case 'c':
                    ch = va_arg(ap, int);
                    printf("%c",ch);
                    break;
            case 'd':
                    ch = va_arg(ap,int);
                    printf("%d",ch);
                    break;
            case 'x':
                    ch = va_arg(ap, int);
                    printf("%#x",ch);
                    break;
            case 'l':
                    if(*++fmt== 'd')
                    {
                        i32value = va_arg(ap, long);
                        printf("%ld",i32value);
                    }
                    else
                    {
                        putch('l');
                        if(*fmt!=0)
                        {
                            putch(*fmt);
                        }
                    }
                    break;
            default:
                    break;
            }
        }
        ++fmt;
    }while(*fmt!='\0');
    va_end(ap);   
}   
   
   void    main(void)   
   {
   TestFun("this is %d,%c,%x,%ld",1234,'6',0x2345,(long)12345678);
   getch();
   }
   
   void    main(void)   
   {
      TestFun("this is %d,%c,%x,%ld",1234,(char)'6',0x2345,(long)12345678);
   getch();
   }     

上述的example使用宏定义, var_start(ap, pareN),var_arg(ap,type),var_end(ap).
var_start(ap, pareN) //是ap指向第一个变参.
var_arg(ap,type),//返回变参的实际值.
var_end(ap).//是ap指向空指针.
具体的实现,在不同的编译环境下有所不同.
此帖出自编程基础论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表