【问题标题】:Transfer „...” parameters to an other function [duplicate]将“...”参数传输到其他函数 [重复]
【发布时间】:2013-12-16 00:54:20
【问题描述】:

有没有办法实现这个?

void func2(...) {
    /*
     * Handle „...” parameters
     */
}
void func1(int n, ...) {
    func2(...);
}

【问题讨论】:

  • 看看stdarg.h
  • @self。不,这不是 stdarg API 的用途。
  • 你应该研究一下 VA_LIST、varargs 和 Variable Argument Lists...
  • @H2CO3 我很确定 va_arg 和公司处理变量参数。
  • @self。他们这样做了,但不是以 OP 想要的方式。

标签: c parameters arguments


【解决方案1】:

不,你不能。不能转发可变参数。您的选择是:

  • 让您的“内部”函数采用(n 初始化)va_list 参数而不是 ...,并从调用者传递该列表;

  • 如果参数是相同的(或可转换的)类型,你可以让它接受一个数组,然后自己解析可变参数并将数组及其长度传递给被调用的函数。

【讨论】:

    【解决方案2】:

    根据维基百科,这是不可能的。 http://en.wikipedia.org/wiki/Stdarg.h

    可变参数函数是可以接受可变数量的函数 参数并用省略号代替最后一个声明 范围。这种函数的一个例子是 printf。可变函数 必须至少有一个命名参数,例如,char *wrong(...); 在 C 中是不允许的。(在 C++ 中,这样的声明是允许的,但不是很有用。)在 C 中,逗号必须在 省略;在 C++ 中,它是可选的。

    所以你的void func2(...) 是非法的。

    【讨论】:

    • 这个答案是正确的,但没有用,因为它没有解决实际问题(关于转发可变参数),并且因为 OP 的示例很容易解决您描述的问题。 (顺便说一句,我既不是赞成票也不是反对票,尽管我知道这两个选民的来源。)
    • 这里写的是真的,但这不是问题。
    • 是的,我想我对这个问题的解释不同。我说写void func2(...)之类的东西是非法的
    • @NoWiS 是的,但这仍然不能回答 OP 的问题。这是对“我可以在没有前导命名参数的情况下声明可变参数函数吗?”的答案,这 不是 OP 正在寻找的。是的,OP 发布了错误的代码,只有他应该为此受到责备,但不回答就是不回答。
    • @H2CO3 我明白你的意思。对不起。
    猜你喜欢
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多