0

我有这个函数:
void func(int a, int b, char s, FILE *fp, int flag)
我想根据标志使用函数的参数。例如: 在我想要
func(num, NOTHING, NOTHING, file, 1)
func(num, othernum, NOTHING, NOTHING, 2)
的功能上:this_is_function

void func(int a, int b, char s, FILE *fp, int flag){
if(flag == 1){
/* use a and file */
}
if(flag == 2){
/* use a,b */
}
/* etc etc */
}

我想知道这是否可能以及如何做到这一点!
提前致谢 :)

4

4 回答 4

4

如果NOTHING你的意思是你真的想省略那个论点,我认为你概述它的方式是不可能的。

这通常在 C 中完成的方式是通过可变参数列表。这意味着你必须重新制定,以便flag先行,因为它决定了其余的论点:

void func(int flag, ...)
{
  va_list args;
  int num, othernum;
  FILE *file;

  va_start(args, flag);
  if(flag == 1)
  {
    num = va_arg(args, int);
    file = va_arg(args, FILE *);
  }
  else if(flag == 2)
  {
    num = va_arg(args, int);
    othernum = va_args(args, int);
  }
  va_end(args);

  /* Inspect `flag` again, and do things with the values we got. */
}

然后你可以像这样使用这个函数:

func(1, 42, a_file);

或者

func(2, 17, 4711);

这当然需要非常小心,因为您不再从编译器获得很多帮助来将调用中提供的值与函数期望的值相匹配。

我建议将其重组为不同的顶级函数,这些函数调用具有适当参数的通用“worker”函数:

func_mode1(42, a_file);
func_mode2(17, 4711);

然后这些可以func()用正确的flag值调用,为不适用的参数(例如NULL未使用的文件指针)填充合适的默认值。

于 2012-06-29T12:54:02.077 回答
2

当您调用函数并且不使用参数时,您可以传递0toint和for 指针。charNULL

func(num, 0, 0, file, 1)
func(num, othernum, 0, NULL, 2)

您还可以使用可变参数函数。可变参数函数是具有可变数量参数的函数。

于 2012-06-29T12:54:32.750 回答
2

为您尝试处理的每个案例创建单独的函数。这将产生更具可读性的代码。通过你的代码陈述你的意图,而不是绕过它。

于 2012-06-29T12:54:06.073 回答
1

您的代码应该可以正常工作,而且尝试一次并检查是否有任何错误。我确信不会发生错误。您也可以尝试switch在 func 中使用 case with flagas the choicefor switch。我相信你不会在你的代码中使用Nothingand 。othersum

于 2012-06-29T12:57:23.227 回答