【问题标题】:Possible to pass arguments inputted at run-time?可以传递在运行时输入的参数吗?
【发布时间】:2013-04-04 08:14:03
【问题描述】:

在 C 中,我们可以使用可变参数函数,例如:

void abc(int x, .. )
{
}

我们可以使用可变数量的参数来调用它们,例如:

abc(1,2,3) or abc(1,2,3,4,5)

但是,在上述两个函数调用中,我们调用了可变参数函数abc,并使用了我们已知的参数;第一种情况是“1, 2, 3”,第二种情况是“1, 2, 3, 4, 5”。

我的问题是:

有没有什么方法可以在运行时调用具有可变数量参数的可变参数函数?

例如,在main() 中,我要求用户输入一定数量的输入,然后使用参数 p1、p2、p3 等将这些输入传递给可变参数函数...

【问题讨论】:

  • 这听起来像是又一次寻找不必要的复杂解决方案,以使事情变得复杂。您甚至不需要在 C 程序中使用 va_list,它们是该语言的一个多余特性。
  • @Lundin 我觉得printf 相当漂亮。我可以想象在其他情况下变量参数列表是有用的,尽管不是绝对必要的。
  • @KlasLindbäck 虽然 printf/scanf 函数功能强大,但它们也非常复杂、缓慢、低效且非常不安全(没有类型安全、可能的缓冲区溢出等)。最重要的是,它们在语法上偏离了语言的其余部分。就个人而言,我认为它们非常可怕。不管你怎么看这些函数,程序员应该没有必要创建自己的 printf 函数,所以 va_lists 是相当多余的。
  • @Lundin,请写printf(3),不要写va_list,然后与我们联系。有 are 用途(我自己编写了一些 varags 函数)。不经常,理所当然。

标签: c variadic-functions


【解决方案1】:

你可以使用数组例如:

void abc(int size, int *arr) { }

主要

int size;
int A[MAX];

size = 3;
A[0] = 1; A[1] = 2; A[2]=3;
abc(size,A);

示例

int size=0;
int A[MAX]; 
while(size<MAX && scanf(" %d",&A[size])!=EOF) {
   size++;
}

 if(size>0) abc(size, A);

【讨论】:

    【解决方案2】:

    实际上和理论上都不建议发明这样的东西,尽管解决方法很有可能......使用一些好的数据结构,如linked list 来存储任意数量的元素并在调用函数中传递头指针。

    【讨论】:

      【解决方案3】:

      不,这是不可能的。
      编译器需要在编译期间生成适当的代码并为标识符保留空间。您将尝试更改静态二进制文件,这是不可能的。这实际上就是va_args 存在的原因,能够传递未知数量的参数。

      【讨论】:

      • 好吧,您可以手动将参数放在堆栈上,但我认为这不明智。
      • @LtWorf 可能有解决方法,你是对的。但是他们会很不方便!而va_args 是一个不错的小工具,为什么要重新发明轮子呢?
      【解决方案4】:

      看起来你应该传递一个指向数组的指针。

      void yourfunction(int *array, size_t len) {
          //Do what you want in your function
      }
      

      【讨论】:

        【解决方案5】:

        你不能轻易做到这一点。 变量参数函数是根据一定的调用约定编译的。 因此,任何动态模仿调用约定的尝试都是不可移植的。

        如果您确实需要这样做,一个解决方案是使用 libffi。 支持调用可变参数函数。

        否则我同意其他使用具有大小作为参数的数组的解决方案。

        【讨论】:

          猜你喜欢
          • 2018-11-03
          • 2022-01-25
          • 1970-01-01
          • 2020-05-06
          • 2018-03-23
          • 2020-10-27
          • 1970-01-01
          • 1970-01-01
          • 2018-09-30
          相关资源
          最近更新 更多