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

C变参函数的实现机制

C的变参问题与print函数的实现
我们在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函数以及这些可变参数的函数编译器是如何实 现的呢?本文就这个问题进行一些探讨,希望能对大家有些帮助.会
C++的网友知道这些问题在C++里不存在,因为C++具有多态性.但C++是C的一个 超集,以下的技术也可以用于C++的程序中.限于本人
的水平,文中如果有 不当之处,请大家指正. 
(一)写一个简单的可变参数的C函数 
下面我们来探讨如何写一个简单的可变参数的C函数.写可变参数的C函数要在程序中用到以下这些宏: 
void va_start( va_list arg_ptr, prev_param ); 
type va_arg( va_list arg_ptr, type ); 
void va_end( va_list arg_ptr ); 
va在这里是variable-argument(可变参数)的意思. 
这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个头文件.下面我们写一个简单的可变参数的函数,该函数至少有一个整数
参数,第二个参数也是整数,是可选的.函数只是打印这两个参数的值. 
   void simple_va_fun(int i, ...)
   {
     va_list arg_ptr;
     int j=0;
     
     va_start(arg_ptr, i);
     j=va_arg(arg_ptr, int);
     va_end(arg_ptr);
     printf("%d %d\n", i, j);
     return;
   } 
我们可以在我们的头文件中这样声明我们的函数: extern void simple_va_fun(int i, ...); 我们在程序中可以这样调用:
   simple_va_fun(100);
   simple_va_fun(100,200);
   从这个函数的实现可以看到,我们使用可变参数应该有以下步骤:
   1)首先在函数里定义一个va_list型的变量,这里是arg_ptr,这个变量是指向参数的指针.
   2)然后用va_


相关文档:

ioframe socket io frame设想中的C网络库


设想中的C网络库ioframe is a simple base socket library using libevent.http://blog.csdn.net/Solstice/archive/2010/03/10/5364096.aspx
按照
的思想提交的一份代码。
设想中的 C++ 网络库线程安全,支持多核多线程在不增加复杂度的前提下可以支持 FreeBSD/Darwin,方便将来用 Mac 作为开发用机,但不为它做性能 ......

PC之父C. Thacker荣获2009年图灵奖


根据ACM官方网站3月9日发布的消息,2009年图灵奖授予了现代PC之父Charles Thacker,以表彰他对第一台现代个人计算机Xerox PARC Alto的先驱性设计与实现,还有在局域网(包括以太网)、多处理器工作站、窥探高速缓存一致性协议和平板PC等方面的重大发明和贡献(For the pioneering design andРrealization of the fi ......

C面试题汇总

1、  int a=2,b=11,c=a+b++/a++; 则c值为多少?
【考点】编码规范。
表面上考察你对运算符优先级的掌握程度,但实际上优先级这些玩意很难死记硬背得住?大家的疑惑不就是运算符的结合顺序么?那么如何去避免呢?c=a+((b++)/(a++))不就行了么,其实问题背后考察的是你的编码规范,如何写清晰易懂的代码,如何在一个团 ......

c中数组大小不能用变量的一个解决办法

今天在写到用c来解析post数据的时候需要用到一个数组变量来放post的所有数据等着来解析,不想太浪费内存了。于是想着先申请一个最大威尔哦content_length大小的数组再说。但是不允许用变量来。比如
int length = atoi(getenv("CONTENT_LENGTH"));
char params[length];
memset(params, '\0', length);

那么char para ......

Linux 下编译C程序

GCC 支持了许多不同的语言,包括 C、C++、Ada、Fortran、Objective C,Perl、Python 和 Ruby,甚至还有Java。
  Linux 内核和许多其他自由软件以及开放源码应用程序都是用 C 语言编写并使用 GCC 编译的。
  编译C++程序:
  -c 只编译不连接
  g++ file1 -c -o file1.o
  g++ file2 -c -o file2.o
  g++ f ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号