快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

和记怡情娱:C语言之可变参数问题



概述

C说话中有一种长度不确定的参数,形如:"…",它主要用在参数个数不确定的函数中,我们最轻易想到的例子是printf函数。

原型:

int printf( const char *format [, argument]... );

应用例:

printf("Enjoy yourself everyday!\n");

printf("The value is %d!\n", value);

这种可变参数可以说是C说话一个对照难理解的部分,这里会由几个问题激发一些对它的阐发。

留意:在C++中有函数重载(overload)可以用来差别不合函数参数的调用,但它照样不能表示随意率性数量的函数参数。

问题:printf的实现

讨教,若何自己实现printf函数,若何处置惩罚此中的可变参数问题? 谜底与阐发:

在标准C说话中定义了一个头文件专门用来对于可变参数列表,和记怡情娱它包孕了一组宏,和一个va_list的typedef声明。一个范例实现如下:

typedef char* va_list;

#define va_start(list) list = (char*)&va_alist

#define va_end(list)

#define va_arg(list, mode)\

((mode*) (list += sizeof(mode)))[-1]

自己实现printf:

#include

int printf(char* format, …)

{

va_list ap;

va_start(ap, format);

int n = vprintf(format, ap);

va_end(ap);

return n;

}

问题:运行时才确定的参数

有没有法子写一个函数,这个函数参数的详细形式可以在运行时才确定?

谜底与阐发:

今朝没有"正规"的办理法子,不过独门偏方倒是有一个,由于有一个函数已经给我们做出了这方面的榜样,那便是main(),它的原型是:

int main(int argc,char *argv[]);

函数的参数是argc和argv。

深入想一下,"只能在运行时确定参数形式",也便是说你没法子从声明中看到所吸收的参数,也等于参和记怡情娱数根本就没有固定的形式。常用的法子是你可以经由过程定义一个void *类型的参数,用它来指向实际的参数区,然后在函数中根据根据必要随意率性解释它们的含义。这便是main函数中argv的含义,而argc,则用来注解实际的参数个数,这为我们应用供给了进一步的方便,当然,这个参数不是必需的。

虽然参数没有固定形式,但我们一定要在函数中解析参数的意义,是以,天经地义会有一个要求,便是调用者和被调者之间要对参数区内容的款式,大年夜小,有效性等所有方面杀青同等,否则南辕北辙各说各话就惨了。

问题:可变和记怡情娱长参数的通报

无意偶尔候,必要编写一个函数,将它的可变长参数直接通报给别的的函数,讨教,这个要求能否实现?

谜底与阐和记怡情娱发:

今朝,你尚无法子直接做到这一点,然则我们可以迂回提高,首先,我们定义被调用函数的参数为va_list类型,同时在调用函数中将可变长参数列表转换为va_list,这样就可以进行变长参数的通报了。看如下所示:

void subfunc (char *fmt, va_list argp)

{

...

arg = va_arg (fmt, argp); /* 从argp中一一掏出所要的参数 */

...

}

void mainfunc (char *fmt, ...)

{

va_list 和记怡情娱argp;

va_start (argp, fmt); /* 将可变长参数转换为va_list */

subfunc (fmt, argp); /* 将va_list通报给子函数 */

va_end (argp);

...

}

问题:可变长参数中类型为函数指针

我想应用va_arg来提掏出可变长参数中类型为函数指针的参数,结果却老是不精确,为什么?

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: