1

我试图编写一个具有可选参数的 C 函数,如果该参数没有“使用”,那么它有一个默认值。

int DumpData(int a, int b, int c=0)
{

if(c != 0)
{
          //stuff
}
    //banana
}

/* Function Call */

DumpData(1, 2);

有没有办法解决这个问题?

4

3 回答 3

8

不,在 C 中没有办法做到这一点。你能做的最好的就是拥有单独的函数:

int DumpData(int a, int b)
{
    return DumpDataABC(a, b, 0);
}

int DumpDataABC(int a, int b, int c)
{
    ...
}

或者,使用 C++ 而不是 C。

于 2013-06-05T21:08:10.330 回答
2

在 C 语言中,这可以通过宏来实现。这种东西的实现有点棘手,所以你最好使用现有的工具箱来做。我在P99中收集了这些东西。有了它,你可以定义类似

#define DumpData(...) P99_CALL_DEFARG(DumpData, 3, __VA_ARGS__)
#define DumpData_defarg_2() 0

第一行声明了一个宏,它应该接收 3 个参数。如果省略参数 2,则第二行用 a0代替参数 2(参数计数从 0 开始)。

这样的宏实际上可以与您的函数命名相同,然后所有这些对调用方的用户都是透明的。

于 2013-06-05T21:43:26.007 回答
1

利用 C11 功能,例如可变参数宏、指定初始化程序和复合文字,您可以完成类似的事情,我知道这个示例很简单,但这种方法对于具有大量参数且多个参数需要默认值的函数很有用:

#include <stdio.h>
#include <stdarg.h>

typedef struct {
  int a, b, c;
} dumpdata_args;

#define DumpData(...) DumpData_Impl((dumpdata_args){.c = 0, __VA_ARGS__})

int DumpData_Impl(dumpdata_args args)
{
  if(args.c != 0)
  {
          //stuff
  }
      //banana  
}

/* Function Call */

DumpData(.a=1,.b=2);
DumpData(.a=1,.b=2,.c=3);
于 2013-06-05T22:00:49.533 回答