C 언어 가 변 매개 변수 valist

3894 단어 c + +listva
#include
#include
#include

/*
1.   va_list va_start va_arg va_end      
*/
void simple_va_fun(int i, ...) {
	va_list arguments;
	int j = 0;
	int k, m;
	va_start(arguments, i);
	j = va_arg(arguments, int);
	m = va_arg(arguments, int);
	va_end(arguments);

	printf("%d,%d,%d
",i,j,m); } /* 2.  */ void fixed_args_func(char x, int a, double b, char *c) { // printf("x = 0x%p
", &x); printf("a = 0x%p
", &a); printf("b = 0x%p
", &b); printf("c = 0x%p
", &c); } /* 3.  , */ void var_args_func(const char * fmt, ...) { char* ap; ap = (char *)&fmt + sizeof(fmt); int* int_ap = (int *)ap; printf("first:%d
",*int_ap); int_ap = int_ap + 1; printf("second:%d
",*int_ap); int_ap = int_ap + 1;// string start index char* c_ptr = (char*)int_ap; char* str = (char* )*int_ap; printf("&int_ap = 0x%p
",int_ap); printf("&c_ptr  = 0x%p
", c_ptr); printf("&str    = 0x%p
",str); // "helloworld ", printf("third1: %s
",str); printf("third2: %s
", *(char **)int_ap); } //stdarg.h  void std_vararg_func(const char *fmt, ...) { va_list ap; va_start(ap, fmt); printf("%d
", va_arg(ap, int)); printf("%f
", va_arg(ap, double)); printf("%s
", va_arg(ap, char*)); va_end(ap); } int main() { //fixed_args_func('a',17, 5.40, "hello world"); //char* p = "xiongwei"; //printf("%d
",sizeof(p)); var_args_func("%d %d %s
", 4, 5, "helloworld"); printf("--------------------------------------
"); std_vararg_func("%d %f %s
", 4, 5.4, "helloworld"); system("pause"); return 0; }

std 비교vararg_func 와 varargs_func 의 실현,valist 는 char*,va 인 것 같 습 니 다.start 는(char*)&fmt)+sizeof(fmt),va 인 것 같 습 니 다.arg 는 다음 인자 의 첫 주 소 를 얻 은 것 같 습 니 다.맞 아,대부분의 플랫폼 에서 stdarg.h 중 valist, va_start 와 vararg 의 실현 은 이와 유사 하 다.일반적으로 stdarg.h 는 매크로 를 많이 포함 하고 복잡 해 보 입 니 다.일부 시스템 에서 stdarg.h 의 실현 은 some special functions built into the compilation system to handle variable argument lists and stack allocations 에 의존 합 니 다.대부분의 다른 시스템 의 실현 은 아래 와 비슷 합 니 다.(Visual C+6.0 의 실현 이 비교적 뚜렷 합 니 다.windows 의 응용 프로그램 은 windows 플랫폼 에서 만 이식 하면 되 기 때 문 입 니 다.플랫폼 상황 을 너무 많이 고려 할 필요 가 없다).
output://
first:4
second : 5
& int_ap = 0x003EF968
& c_ptr = 0x003EF968
& str = 0x013780D4
third1 : helloworld
third2 : helloworld
--------------------------------------
4
5.400000
helloworld
Printf()함수 구현:
#include "stdio.h"
#include "stdlib.h"
void myprintf( char* fmt, ... )         /*         printf   ,//      int    */
{
	char	* pArg = NULL;          /*       va_list */
	char	c;

	pArg	= (char *) &fmt;        /*       p = fmt !!      //    ,      */
	pArg	+= sizeof(fmt);         /*       va_start */

	do
	{
		c = *fmt;
		if ( c != '%' )
		{
			putchar( c );   /*         */
		}else     {
			/*          */
			switch ( *++fmt )
			{
			case 'd':
				printf( "%d", *( (int *) pArg) );
				break;
			case 'x':
				printf( "%#x", *( (int *) pArg) );
				break;
			default:
				break;
			}
			pArg += sizeof(int);    /*       va_arg */
		}
		++fmt;
	}
	while ( *fmt != '\0' );
	pArg = NULL;                            /*    va_end */
	return;
}


int main( int argc, char* argv[] )
{
	int	i	= 1234;
	int	j	= 5678;

	myprintf( "thefirst test:i=%d", i, j );
	myprintf( "thesecend test:i=%d; %x;j=%d;", i, 0xabcd, j );
	system( "pause" );
	return(0);
}

좋은 웹페이지 즐겨찾기