关于不定参数函数的问题?

Tesiro 2008-11-18 12:19:34
写了一个不定参数的小函数,可是在Debug与Release版本中的执行结果不同,想请教一下, 代码如下:

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);
}


在Debug版本中是正常的,但是在Release版本中不能正常打印出10,只能打印出20与30.
...全文
172 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tesiro 2008-11-24
  • 打赏
  • 举报
回复
谢谢ztz0223的回答, 我觉得他说的是对的, 当然也谢谢其他的朋友, 这个问题我明白了, 结了:)
Tesiro 2008-11-24
  • 打赏
  • 举报
回复
谢谢ztz0223的回答, 我觉得他说的是对的, 当然也谢谢其他的朋友, 这个问题我明白了, 结了:)
就呆在云上 2008-11-19
  • 打赏
  • 举报
回复
看我14楼回复吧
输入和输出都是
10
20
30
xuegao007 2008-11-19
  • 打赏
  • 举报
回复
mark
toadzw 2008-11-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xhs_lh04 的回复:]
引用 2 楼 hqin6 的回复:
C/C++ code
http://hi.baidu.com/hbwc/blog/item/72662d2de3232332349bf72a.html

看看这篇文章:

简单的说:

__stdcall是被调用者清除堆栈(c++标准调用、自动清除,最后一个入栈的是this指针,函数在编译的时候就必须确定参数个数)

__cdecl 是调用者清除堆栈(c默认方式、也叫手动清除)


那么为什么还需要_cdecl呢?当我们遇到这样的函数如fprintf()它的参数是可变
的,不…
[/Quote]
up
就呆在云上 2008-11-19
  • 打赏
  • 举报
回复
dubug和release的区别在与说的不对,他们有很多区别,不定参数是一个区别
就呆在云上 2008-11-19
  • 打赏
  • 举报
回复

跟__cdecl 有什么关系啊?
无语了
调试一下ok?

dubug和release的区别在与,不定参数或者说变参的函数的读取的差别上面,不懂的去看看两者的区别。
因为release吧把变参的第一个调过去了,从arg【1】开始的因此很明显就会多跳一个,在楼主的程序里面10就成了:
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);
}



有些的回复真的无语
WingForce 2008-11-19
  • 打赏
  • 举报
回复
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);
}

msdn65997404 2008-11-18
  • 打赏
  • 举报
回复
不建议使用不定参数函数...
建议用传数组指针和数组大小的方式传递不定参数
恩恩 我是这么想的 欢迎讨论
太乙 2008-11-18
  • 打赏
  • 举报
回复

http://hi.baidu.com/hbwc/blog/item/72662d2de3232332349bf72a.html

看看这篇文章:

简单的说:

__stdcall是被调用者清除堆栈(c++标准调用、自动清除,最后一个入栈的是this指针,函数在编译的时候就必须确定参数个数)

__cdecl 是调用者清除堆栈(c默认方式、也叫手动清除)




那么为什么还需要_cdecl呢?当我们遇到这样的函数如fprintf()它的参数是可变
的,不定长的,被调用者事先无法知道参数的长度,事后的清除工作也无法正常的进行
,因此,这种情况我们只能使用_cdecl。


太乙 2008-11-18
  • 打赏
  • 举报
回复




VOID __stdcall Fun(LPTSTR lpszInfo1, LPTSTR lpszInfo2, ...);


改为:


VOID __cdecl Fun(LPTSTR lpszInfo1, LPTSTR lpszInfo2, ...);


yuwei2589 2008-11-18
  • 打赏
  • 举报
回复
2楼解释的很对!~

__cdecl和__stdcall的区别。
不定参数的函数必须是__cdecl
Longinc 2008-11-18
  • 打赏
  • 举报
回复
学习
帅得不敢出门 2008-11-18
  • 打赏
  • 举报
回复
2楼正解.
Tesiro 2008-11-18
  • 打赏
  • 举报
回复
再说,我就是使用__stdcall调用约定,在Release版本中,函数返回时也没有出现错误呀?
  • 打赏
  • 举报
回复
进来学习,嘿嘿
Tesiro 2008-11-18
  • 打赏
  • 举报
回复
不行呀,我按照二楼的方法改了之后还是一样,Debug正常,Release还是只能输出20,30.
liaoweixiaoyu 2008-11-18
  • 打赏
  • 举报
回复
up
xhs_lh04 2008-11-18
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 hqin6 的回复:]
C/C++ code
http://hi.baidu.com/hbwc/blog/item/72662d2de3232332349bf72a.html

看看这篇文章:

简单的说:

__stdcall是被调用者清除堆栈(c++标准调用、自动清除,最后一个入栈的是this指针,函数在编译的时候就必须确定参数个数)

__cdecl 是调用者清除堆栈(c默认方式、也叫手动清除)




那么为什么还需要_cdecl呢?当我们遇到这样的函数如fprintf()它的参数是可变
的,不定长的,被调用者事先无法知道…
[/Quote]


说的有理,是的就是这样
WingForce 2008-11-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 msdn65997404 的回复:]
不建议使用不定参数函数...
建议用传数组指针和数组大小的方式传递不定参数
恩恩 我是这么想的 欢迎讨论
[/Quote]

为什么呢,能否讲解一下

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧