问我有一个预 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 页