浅谈C语言C++中可变参数问题!!!
2015-06-15 08:35
302 查看
浅谈C语言C++中可变参数问题!!!这里只是抛砖引玉,简要说明其原理。
首先贴一段代码,用代码说话!
可以清晰地看到,可变参数就是基于函数参数在栈中的线性排布,通过第一个参数的地址依次取得后面参数的值,或者说高地址的值,printf函数就是基于这样的原理,只是多了一些对参数的分析与重新解释而已,原理一样。需要说明的是可变参数函数的调用约定为__cdecl,因为C语言C++的默认调用约定就是__cdecl
,这里不显式写出也可以。
首先贴一段代码,用代码说话!
#include<iostream> using std::cout; using std::endl; int add(int count ...) // count表示除count参数之后的参数个数 { //此函数计算count参数之后的参数之和 // 如输入add(3,5,10,5)那么结果为 5+10+5 = 20 int *ptr = &count; //取得参数的地址 ++ptr; // 后移一位 int sum = 0; for(int i = 0; i < count; ++i) sum += *(ptr+i); //依次获得后面参数的值 return sum; } int main() { cout<<add(5,1,2,3,4,5)<<endl; // 1 + 2 + 3 + 4 + 5 = 15 cout<<add(3,5,10,20)<<endl; // 5 + 10 +20 = 35 system("pause"); return 0; }
可以清晰地看到,可变参数就是基于函数参数在栈中的线性排布,通过第一个参数的地址依次取得后面参数的值,或者说高地址的值,printf函数就是基于这样的原理,只是多了一些对参数的分析与重新解释而已,原理一样。需要说明的是可变参数函数的调用约定为__cdecl,因为C语言C++的默认调用约定就是__cdecl
,这里不显式写出也可以。
相关文章推荐
- C++ Circle类
- C++ 64位自定义随机数生成器的使用 <random> 参照C++11
- 经典C语言程序编码-利润计算
- 【C语言】《C程序设计语言》通读摘录
- boost asio学习笔记 [1] - 同步通讯
- 【C语言】程序内存四区
- Tower of Hanoi by C++
- Effective C++ 条款01解读: 视C++为一个语言联邦
- c语言的冒泡排序
- 【C语言】数据类型和变量
- 【C语言】C语言注释转换成C++注释。
- C语言数组与指针
- 位段
- c++基础学习(05AM)
- OS X以及iOS平台上的的动态库导出c++接口类
- c++ virtual总结
- KMP算法匹配原理以及C++实现
- VC++调试,TRACE()函数的用法
- Effective C++ 条款02解读: 尽量以const, enum, inline替换#define
- 第14周 【项目4 - 处理C++源代码的程序】(1)