gpt4 book ai didi

c - 这是将 va_arg 与函数指针一起使用的正确方法吗?

转载 作者:太空狗 更新时间:2023-10-29 15:28:37 24 4
gpt4 key购买 nike

在这样的函数中:

typedef double(*dfun)(double);

void tab(double x, int n, ...)
{
va_list args;

va_start(args, n);

printf("%5.2lf \t", x);

for (int i=0; i<n; i++)
{
dfun tmp = va_arg(args, dfun);

printf(" %5.2lf \t", tmp(x));
}

va_end(args);
}

如果我这样提取参数是不是错了:

    double(*tmp)(double) = va_arg(args, double(*)(double));

我遇到了 this如果它不起作用,建议采用不同方法的文章:

Q: I can't get va_arg to pull in an argument of type pointer-to-function.

A: Try using a typedef for the function pointer type. The type-rewriting games which the va_arg macro typically plays are stymied by overly-complicated types such as pointer-to-function.

就我而言,它适用于两个版本 (GCC 5.2.1),这就是为什么我想知道一种方法是否比另一种更好?如果我不首先对指向函数的指针进行类型定义,是否存在一些潜在的错误?

最佳答案

在某些情况下使用没有 typedef 的指针确实会导致问题。

标准解释说 va_arg 中使用的 type 必须以某种方式编写,其中添加后缀 * 将创建指向 类型:

7.16.1.1 The va_arg macro

  1. The parameter type shall be a type name specified such that the type of a pointer to an object that has the specified type can be obtained simply by postfixing a * to type.

因此要有兼容的代码,当使用函数指针时,你应该使用 typedef,因为 * 不能添加到函数指针类型作为后缀来创建指向该类型的指针,因为语法无效:

(double)(*)(double) => (double)(*)(double)*

但它可以添加到 typedef 中:

dfun => dfun*

关于c - 这是将 va_arg 与函数指针一起使用的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37113736/

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