我试图编写一个具有可选参数的C函数,如果该参数未被“使用”,则它具有默认值。
int DumpData(int a, int b, int c=0)
{
if(c != 0)
{
//stuff
}
//banana
}
/* Function Call */
DumpData(1, 2);
有没有办法解决这个问题?
答案 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);