接受默认参数的C函数

时间:2013-06-05 21:06:04

标签: c function default-arguments

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

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

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

/* Function Call */

DumpData(1, 2);

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

3 个答案:

答案 0 :(得分:8)

不,在C中没有办法做到这一点。你能做的最好的事情就是拥有不同的功能:

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

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

或者,使用C ++代替C。

答案 1 :(得分:2)

在C中,这可以通过宏来实现。这样的事情的实现有点棘手,所以你最好使用现有的工具箱来做到这一点。我在P99收集了这些内容。有了它,你可以定义类似

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

第一行声明一个应该接收3个参数的宏。第二行替换0代替参数2,如果省略那个(参数计数从0开始)。

这样的宏实际上可以与您的函数命名相同,所有这些对于呼叫方的用户来说都是透明的。

答案 2 :(得分: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);