69,373
社区成员
发帖
与我相关
我的任务
分享
VOID __stdcall Fun(LPTSTR lpszInfo1, LPTSTR lpszInfo2, ...);
int _tmain(int argc, _TCHAR* argv[])
{
Fun(TEXT("info1 "), TEXT("Info2 "), 10, 20, 30, 0);
return 0;
}
VOID __stdcall Fun(LPTSTR lpszInfo1, LPTSTR lpszInfo2, ...)
{
INT nNum = 0;
va_list argList = NULL;
va_start(argList, lpszInfo1);
va_arg(argList, LPTSTR);
while (0 != (nNum = va_arg(argList, INT)))
{
printf("%d\n", nNum);
}
va_end(argList);
}
va_arg(argList, LPTSTR);
VOID __stdcall Fun(LPTSTR lpszInfo1, LPTSTR lpszInfo2, ...);
int _tmain(int argc, _TCHAR* argv[])
{
Fun(TEXT("info1 "), TEXT("Info2 "), 10, 20, 30, 0);
return 0;
}
VOID __stdcall Fun(LPTSTR lpszInfo1, LPTSTR lpszInfo2, ...)
{
INT nNum = 0;
va_list argList = NULL;
va_start(argList, lpszInfo1);
#if _DEBUG
va_arg(argList, char*);
#endif
while (0 != (nNum = va_arg(argList, INT)))
{
printf("%d\n", nNum);
}
va_end(argList);
}
VOID __cdecl Fun(LPTSTR lpszInfo1, LPTSTR lpszInfo2, ...)
{
INT nNum = 0;
va_list argList = NULL;
va_start(argList, lpszInfo1);
while (0 != (nNum = va_arg(argList, INT)))
printf("%d\n", nNum);
va_end(argList);
}
http://hi.baidu.com/hbwc/blog/item/72662d2de3232332349bf72a.html
看看这篇文章:
简单的说:
__stdcall是被调用者清除堆栈(c++标准调用、自动清除,最后一个入栈的是this指针,函数在编译的时候就必须确定参数个数)
__cdecl 是调用者清除堆栈(c默认方式、也叫手动清除)
那么为什么还需要_cdecl呢?当我们遇到这样的函数如fprintf()它的参数是可变
的,不定长的,被调用者事先无法知道参数的长度,事后的清除工作也无法正常的进行
,因此,这种情况我们只能使用_cdecl。
VOID __stdcall Fun(LPTSTR lpszInfo1, LPTSTR lpszInfo2, ...);
改为:
VOID __cdecl Fun(LPTSTR lpszInfo1, LPTSTR lpszInfo2, ...);