日期:2014-05-16  浏览次数:20662 次

Linux C开发中的“va_arg, va_start, va_end,va_list”分别表示什么意思 ?
有一段DEMO函数,已经用1~5标识了5个问题,谁能帮我解释一下 ? 非常感谢! 
函数如下:
/**   cSplit : | 分隔符   
       pSrc   : 指向待分解的字符串   
       nItemCount : 目前传入的是 9*/
int etc_StrSplit(char cSplit, char *pSrc, int nItemCount, ...)
{    va_list ap;              // 1:什么意思 ?    
      char *pArg = NULL;    
     char *pStart = pSrc;    
     char *pEnd = NULL;    
     int i;    
     va_start( ap, nItemCount );   // 2:什么意思 ?    
      for( i = 0; i < nItemCount; i++ )    
     {        pArg = va_arg( ap, char * );    // 3:什么意思 ?        
                if( pArg == NULL )            
                 break;        
              pEnd = strchr( pStart, cSplit );        
              if( pEnd == NULL )            
                 break;        
              memcpy( pArg, pStart, pEnd - pStart );        
              pStart = pEnd + 1;    
     }    
     va_end( ap );    // 4:什么意思 ?    
      return i;     // 5:什么意思 ?
}

------解决方案--------------------
其实这个看专门介绍的文章比较好点,这里回答那么点字很难解释清楚,这个就是给可变参数用的。
1是声明 参数list
2是初始化那个list
3逐个取出参数
4和start对应,释放资源
5仅仅是返回而已
就是你不知道参数个数,可以用这个来逐个取到参数。
------解决方案--------------------
系统程序员成长计划-像机器一样思考(一)
这篇文章里有对于变参函数原理的解释。