
声明 "…" 必须放在参数列表的最后,例如:
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;
}
Powered by Haiwit