gpt4 book ai didi

c - 使用指向 const char 的指针作为 va_start 的第二个参数

转载 作者:行者123 更新时间:2023-12-04 11:42:13 24 4
gpt4 key购买 nike

我正在研究 UNIX 环境中的高级编程 3-Edition,我找到了这段代码

err_msg(const char *fmt, ...)
{
va_list ap;

va_start(ap, fmt);
err_doit(0, 0, fmt, ap);
va_end(ap);
}

err_doit是:

static void
err_doit(int errnoflag, int error, const char *fmt, va_list ap)
{
char buf[MAXLINE];

vsnprintf(buf, MAXLINE-1, fmt, ap);
if (errnoflag)
snprintf(buf+strlen(buf), MAXLINE-strlen(buf)-1, ": %s",
strerror(error));
strcat(buf, "\n");
fflush(stdout); /* in case stdout and stderr are the same */
fputs(buf, stderr);
fflush(NULL); /* flushes all stdio output streams */
}

我不明白的是,为什么作者将指向 const char 的指针作为 va_start 的参数传递。据我所知,您只允许传递由省略号部分表示的参数数量,如下所述:

void f1(int n, ...);
int f2(const char * s, int k, ...);

最右边的参数(省略号之前的那个)起着特殊的作用;标准用途术语 parmN 作为讨论中使用的名称。在前面的示例中,parmN 将为 n对于第一种情况,k 对于第二种情况。 传递给这个参数的实际参数将是省略号部分表示的参数数量来源:Stephen Prata 的 C Primer Plus。

我还检查了用 ISO C 标准:7.15 变量参数 编写的两个示例,我发现它们也传递了一个 int 变量到 va_start 宏。

恐怕是我在某处遗漏了一点。希望有人告诉我。

最佳答案

va_start 的第二个参数是可变参数参数开始之前的最后一个“真实”参数。

err_msg() 函数只有一个普通参数,const char *fmt 指针,所以很明显这是可变参数部分之前的最后一个参数并且应该传递给 va_start()

The manual page说:

The argument last is the name of the last argument before the variable argument list, that is, the last argument of which the calling function knows the type.

va_list 的第二个参数的实际类型无关紧要。

另请注意,很常见的 printf()函数很可能正是这样做的,因为它也只有一个“普通”参数,即格式字符串。

关于c - 使用指向 const char 的指针作为 va_start 的第二个参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28768581/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com