易截截图软件、单文件、免安装、纯绿色、仅160KB

C/C++不定参数的用法

C++不定参数的用法 (C类似)
2009-11-19 15:41
/*
va_list vl; //定义一个指向参数列表的变量(一个...指针)
va_start(vl,first_param); //把指向参数列表的变量初始化
va_arg(vl,mode); //获取下一个参数,参数类型由第二个参数指定,第二个参数用于在va_arg内部进行尺寸计算,以便找到下一个参数
va_end(vl); //结束
*/
#include <iostream>
#include <cstdarg> //头文件包含:C++ <cstdarg>; C <stdarg.h>
using namespace std;
void variable(int i,...)
{
      int j=0;
      va_list arg_ptr; //定义一个指向参数列表的变量
      va_start(arg_ptr,i); //把指向参数列表的变量初始化
      while(j!=-1) //自定义的一个参数结束标志
      {
             j=va_arg(arg_ptr,int); //获取下一个参数
             printf("%d ",j);
      }
      va_end(arg_ptr); //结束
}
int main()
{
      variable(3,3,4,5,6,-1);
      return 0;
}
一、什么是可变参数
我们在C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为:
int printf( const char* format, ...);
它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的(用三个点"…"做参数占位符),实际调用时可以有以下的形式:
printf("%d",i);
printf("%s",s);
printf("the number is %d ,string is:%s", i, s);   
以上这些东西已为大家所熟悉。但是究竟如何写可变参数的C函数以及这些可变参数的函数编译器是如何实现,这个问题却一直困扰了我好久。本文就这个问题进行一些探讨,希望能对大家有些帮助.
二、可变参数在编译器中的处理
我们知道va_start,va_arg,va_end 是在stdarg.h中被定义成宏的, 由于1)硬件平台的不同 2)编译器的不同,所以定义的宏也有所不同,下面看一下VC++6.0中stdarg.h里的代码(文件的路径为VC安装目录下的\vc98 \include\stdarg.h)
typedef char *     va_lis


相关文档:

C中括号优先级的思考

问题源于论坛的一道题目:
http://topic.csdn.net/u/20100216/21/ec98464e-a47e-4263-bb1c-a001e130ba87.html
下面是问题:
设int arr[]={6,7,8,9,10};
int *ptr=arr;
*(ptr++)+=123;
printf("%d,%d",*ptr,*(++ptr));
答案为什么是:8,8
问题的焦点也落在printf执行的问题上,到底先执行谁,后执行谁, 还有部分 ......

转]C,C++经典问题,及面试笔试题


1       编程基础
1.1    基本概念
1.         的理解:const char*, char const*, char*const的区别问题几乎是C++面试中每次    都会有的题目。 事实上这个概念谁都有只是三种声明方式非常相似很容易记混。 Bja ......

C/C++代码检视要点


版权申明:以下内容属于作者正在写作的《软件测试实践》一书的内容,未经许可不得用于任何正式出版物中,如果转载请注明出处。
作者:周伟明
代码检视要点
代码检视技能属于开发人员的基本功,能够很大程度地反应出开发人员的能力水平,前面4.4.1节已经讲过提高评审检视的方法。下面以实际的C/C++语言方面的代码来讲解 ......

C和C++之间的不同

(注,本文是翻译的http://www.cprogramming.com/
上的文章 Where C and C++ Differ

C++基于C,也保留了C的大部分特性。但是在源码级上有些地方是与C不兼容的。
C程序员使用C++时的陷阱
从 void* 的隐式分配
不能从 void* 隐式地分配到其他任何类型。例如,下面的代码在C中是非常有效的。
    in ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号