首页 ┆ 网站地图 ┆ 在线留言 ┆ 游戏资讯 ┆ 资源下载 ┆ 端午节祝福 ┆ 迅雷在线影视
设为首页
加入收藏
联系我们
高级搜索
您当前的位置: 主页>C/C++>C语言>不定参数在C语言中的应用实例
不定参数在C语言中的应用实例
来源: 发布时间:2008-05-19 发布人: 浏览: 人次   字体: [ ]  

潜在问题

使用不定参数列表,有两个问题特别需要注意。

问题1的理解相对简单:我们在重载一个函数的时候,不能依赖不定参数列表部分对函数进行区分。

假定我们定义两个重载函数如下:

int func(int a, int b, ...)

int func(int a, int b, float c);

则上述函数会导致编译器不知道怎么去解释func(1,2, 3.3),因为当第三个参数为浮点数时,两个实现都可以满足匹配要求。一般情况,个人建议对于不定参数函数不要去做重载。

另外一个问题是关于类型问题。绝大多数情况下,C和C++的变量都是强类型的,而不定参数列表属于一个特例。

当我们调用va_arg的时候,我们指明下一个参数的类型,而在执行的时候,va_arg正是根据这个信息在堆栈上来找到对应的参数的。如果我们需要的类型和真实传递进来的参数完全一致时自然没有问题,但是假如类型不一样,则会有大麻烦。

假如上面的的sumi函数,我们用下面方法调用:

int sum = sumi(12.230)

注意第二个参数我们传入了一个double类型的2.2,我们希望sumi在做加法时可以做隐式类型转换,转换为int进行计算。但是实际情况时,当我们分析到这个参数时,调用的是:

c=va_arg(ap,int)

根据前文va_arg的定义,这个宏被翻译成:

#define va_arg(ap,t)    ( *(int *)((ap += _INTSIZEOF(int)) - _INTSIZEOF(int)) )

如果后面的+=计算出正确的地址,最后就变成

*(int*)addr

如果希望能得到正确的整数值,必须要求addr所在的地址是一个真实的int类型。但是当我们传入double时,实际上其内存布局和int完全不同,因此我们得不到需要的整数。感兴趣的朋友可以用下面简单的代码做测试:

double a;
a
=1.1;
int b = *(int*& a;

因此,当我们调用有不定参数列表的函数时,不要期望系统做隐式类型转换,系统不会做这种检查或者转换,你给的参数类型必须严格和你希望的值一样。


共2页: 上一页 [1] 2 下一页
相 关 文 章   发布商链接
·C语言开发实现的虚拟桌面程序代码
·C语言高手总结的新手容易犯的错误
·五个步骤讲述C语言编写Windows服务程...
·Win32平台下如何安装Openssl及其注意...
·c语言操作符的优先级排列及其说明
·C语言数组排序小结
·深入理解C语言指针的奥秘
·C语言获得整数类型和浮点类型的大小...
·利用c语言编制cgi实现搜索
·C语言程序设计基础之预处理
 §最新评论:(评论内容只代表网友观点,与本站立场无关!)
网名: 验证码:  【所有评论】【↑返回顶部
评 分: 12 345
评论内容:(不能超过500字,请自觉遵守互联网相关政策法规。[按 Ctrl+Enter 可直接提交]
注意:请勿在本站发布政治话题、色情及违反法律的内容。
IT知道网 声明:刊登此文章是为了传递更多信息,文章内容仅供参考,转载请注明出处。
推 荐 文 章
·C语言高手总结的新手容易犯的
·C语言开发实现的虚拟桌面程序
·实例讲解C语言OPEN函数语法及
·怎样用C语言得到一个进程的全
·Linux下实时定时器在C语言中...
·linux下的c语言的随机数算法...
·C语言宏定义使用技巧
·C语言的无符号数据类型int,sh...
·字母全排列快速算法C代码
·用C语言实现一个简单实用的单
·如何用C语言编写Windows服务...
·C语言程序设计基础之预处理
热 门 文 章
·Linux下实时定时器在C语言中...
·C语言的无符号数据类型int,sh...
·用C语言实现一个简单实用的单...
·C语言宏定义使用技巧
·C语言获得整数类型和浮点类型...
·Win32平台下如何安装Openssl...
·实例讲解C语言OPEN函数语法及...
·字母全排列快速算法C代码
·C语言开发实现的虚拟桌面程序...
·linux下的c语言的随机数算法...
·C语言数组排序小结
·c语言操作符的优先级排列及其...
·如何用C语言编写Windows服务...
·怎样用C语言得到一个进程的全...
·C语言程序设计基础之预处理
网站首页 - 关于本站 - 加入收藏 - 网站地图 - 友情连接 - 在线留言 - 联系我们 - 返回顶部
Copyright © 2007 IT知道网.[冀ICP备07026896号]. All Rights Reserved .