关于变参函数的实践

#include "tinyxml.h"
#include 
 
 
  
  
#include 
  
  
   
   
#include 
   
   
    
    

using namespace std;

/**
    
    

    
    
**/
const char* AssembleXml(char* elemvalue, char* attrname1, char* attrvalue1, 
                        char* attrname2, char* attrvalue2, char* attrname3,
						
                        char* attrvalue3 ...);

const char* AssembleXml2(int num, char* format, ...);

int main()
{

    const char* start = AssembleXml("monitor","action","start",NULL,NULL,NULL,NULL);
    printf("%s/n",start);

    const char* stop = AssembleXml("monitor","action","stop",NULL,NULL,NULL,NULL);
    printf("%s/n",stop);

    const char* catchmonitor = AssembleXml("capturescreen",NULL,NULL,NULL,NULL,NULL,NULL);
    printf("%s/n",catchmonitor);

    const char* requestvolume = AssembleXml("volume","action","get",NULL,NULL,NULL,NULL);
    printf("%s/n",requestvolume);

    const char* setvolume = AssembleXml2(5,"volume","action","set","value","12");
    printf("%s/n",setvolume);

    const char* controlterminal = AssembleXml("control","action","shutdown",NULL,NULL,NULL,NULL);
    printf("%s/n",controlterminal);

    const char* controlterminal1 = AssembleXml2(7,"control1","action1","shutdown1","name","zz","age","25");
    printf("%s/n",controlterminal1);

    return 0;
}


const char* AssembleXml(char* elemvalue, char* attrname1, char* attrvalue1, 
                        char* attrname2, char* attrvalue2, char* attrname3,
						
                        char* attrvalue3 ...)
{
    if(elemvalue == NULL)
        return NULL;
    TiXmlDocument doc;
    TiXmlDeclaration* dec = new TiXmlDeclaration("1.0","utf-8","");
    doc.LinkEndChild(dec);
    TiXmlElement* root = new TiXmlElement("result");
    doc.LinkEndChild(root);
    root->SetAttribute("dmbversion","2.0");
    root->SetAttribute("sequence","0");
    root->SetAttribute("type","server");

    TiXmlElement* elem = new TiXmlElement(elemvalue);
    root->LinkEndChild(elem);
    if(attrname1 != NULL)
    elem->SetAttribute(attrname1,attrvalue1);
    if(attrname2 != NULL)
    elem->SetAttribute(attrname2,attrvalue2);
    if(attrname3 != NULL)
    elem->SetAttribute(attrname3,attrvalue3);
    //doc.SaveFile("work.xml");
    TiXmlPrinter printer;
    doc.Accept(&printer);
    string s = printer.CStr();
    return s.c_str();
}

const char* AssembleXml2(int num, char* format, ...)
{
    if(format == NULL)
        return NULL;
    TiXmlDocument doc;
    TiXmlDeclaration* dec = new TiXmlDeclaration("1.0","utf-8","");
    doc.LinkEndChild(dec);
    TiXmlElement* root = new TiXmlElement("result");
    doc.LinkEndChild(root);
    root->SetAttribute("dmbversion","2.0");
    root->SetAttribute("sequence","0");
    root->SetAttribute("type","server");

    va_list arg;
	
    char* chr;
	
    char* e_name;
	
    char* e_value;
    TiXmlElement* elem;
    /
    va_start(arg, format);

    int count = 0;

   // int i ;
    elem = new TiXmlElement(format);      
    root->LinkEndChild(elem);
    
    while(num-1 > 0)
    {
       //chr = (char*)(va_arg(arg, int));
        chr = va_arg(arg, char*);
       if(count%2 == 0)

        {
           e_name = chr;
        }
		
       if(count%2 == 1)
		
       {
			
           e_value = chr;			
           elem->SetAttribute(e_name,e_value);
		
       }
        num--;

        count++;
    }          
    
va_end (arg);
    
    TiXmlPrinter printer;
    doc.Accept(&printer);
    string s = printer.CStr();
    return s.c_str();
}

   
   
  
  
 
 

 有点懒,所以也就不想做提取那种体力活了,主要想记下自己写的变参函数,变参操作就是/

包含的部分,

一般的用法是这样:

va_list args; //声明变量

va_start(args, fmt); //开始解析。args指向fmt后面的参数

TYPE var = va_arg(args, TYPE); //取下一个参数并返回。args指向下一个参数

这个函数比较烦人,linux下老出现段错误,关键在于控制循环次数,至少我是没办法了,至少是现在还向不出,只能在应用时输入参数数量进行流程控制,有人说要数据对齐什么的,所以通常会写成va_arg(...,int)的形式,我用char*也没啥反应,还省的类型转换了,呵呵!

va_end(args); //结束解析

这个是在写一个模块时,要组装xml,协议定好的,但是部分值不确定数量,所以也是懒了才写个变参的,至少不用一个个组装,我很懒的。有个头文件tinyxml.h是xml解析库,可以无视……还有留那么多主要原因是显得行数多,呵呵!凑字数...

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值