正在加载...
 
< Exceptions...
分析由编译器优化而产... >
C 语言的可变长参数列表 
  主题:[编程] | 标签:C/C++ | 浏览数(267) | 评论数(2) | 08-27 20:25

声明 "…" 必须放在参数列表的最后,例如:
void Printf(const char* pszFormat, ...);
通常来说,在 "…" 之前至少要有一个参数,因为我们需要通过这个参数来获得其他参数的地址。
标准库头文件 <stdarg.h> 中包含了一组宏,用于帮助我们来处理变长参数列表:
void Printf(const char* pszFormat, ...)
{
 // va_list 是一个类型
 // 通常的定义为 typedef char* va_list
 va_list ap;
 // va_start 是一个宏,用于初始化 ap,使之指向第一个未命名的参数
 // va_start 需要使用最后一个命名的参数
 va_start(ap, pszFormat);
 // 返回未命名参数并指向下一个未命名参数
 int nA = va_arg(ap, int);
 std::cout << nA << std::endl;
 // cleanup
 va_end(ap);
}

 

看一下的代码(C++ 总有一些地方比较诡异):

void Func1(void) {}
void Func2(int nNum) 
{
  std::cout << nNum << std::endl;
}
void Func3(int nNum, double dNum) 
{
  std::cout << nNum << std::endl;
  std::cout << dNum << std::endl;  
}
void Func4(const char* pszName) 
{
  std::cout << pszName << std::endl; 
}

typedef void* (*PFUNC)(...);

int main()
{
  // 调用函数 Func1
  PFUNC pFunc = PFUNC(Func1);
  pFunc();
  // 调用函数 Func2 
  pFunc = PFUNC(Func2);
  pFunc(1);
  // 调用函数 Func3
  pFunc = PFUNC(Func3);
  pFunc(1, 3.3);
  // 调用函数 Func4
  pFunc = PFUNC(Func4);
  pFunc("Func4");
  system("pause");  
  return 0;  
}

http://www.i170.com/Article/110494/trackback

评论:

  tommyyou  08-29 10:58 评论  

你也关注这个了 我前几天在看这个 公司都用这类函数

  BETTER  08-29 18:59 评论  

头都大了哦

    发表评论: