prev up next   top/contents search

comp.lang.c FAQ 列表· 第 15.7 题

我有一个预 ANSI 编译器,没有<stdarg.h>。我该怎么办?


有一个较旧的头文件<varargs.h>,它提供了大致相同的功能。

这是vstrcat函数(来自第 15.4 题),重写为使用<varargs.h>:

#include <stdio.h>
#include <varargs.h>
#include <string.h>

extern char *malloc();

char *vstrcat(va_alist)
va_dcl		/* no semicolon */
{
	int len = 0;
	char *retbuf;
	va_list argp;
	char *p;

	va_start(argp);

	while((p = va_arg(argp, char *)) != NULL)	/* includes first */
		len += strlen(p);

	va_end(argp);

	retbuf = malloc(len + 1);		/* +1 for trailing \0 */

	if(retbuf == NULL)
		return NULL;			/* error */

	retbuf[0] = '\0';

	va_start(argp);			/* restart for second scan */

	while((p = va_arg(argp, char *)) != NULL)	/* includes first */
		strcat(retbuf, p);

	va_end(argp);

	return retbuf;
}
(注意 `va_dcl` 后面没有分号) 。在这种情况下,无需对第一个参数进行特殊处理。)您可能还需要手动声明字符串函数,而不是使用va_dcl<string.h>如果您能找到一个带有.

vfprintf但没有,这是该<stdarg.h>error函数(来自第 15.5 题)的一个版本,使用了(注意,与<varargs.h>:

#include <stdio.h>
#include <varargs.h>

void error(va_alist)
va_dcl		/* no semicolon */
	{
	char *fmt;
	va_list argp;
	fprintf(stderr, "error: ");
	va_start(argp);
	fmt = va_arg(argp, char *);
	vfprintf(stderr, fmt, argp);
	va_end(argp);
	fprintf(stderr, "\n");
}
不同,在这种情况下,**所有** 参数都是可变的,因此<stdarg.h>fmt<varargs.h> 参数也必须通过va_arg来获取。)va_arg.)

参考文献:H&S 第 11.4 节,第 296-9 页
CT&P 第 A.2 节,第 134-139 页
PCS 第 11 节,第 184-5 页,第 13 节,第 250 页


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管