我试图编写一个具有可选参数的 C 函数,如果该参数没有“使用”,那么它有一个默认值。
int DumpData(int a, int b, int c=0)
{
if(c != 0)
{
//stuff
}
//banana
}
/* Function Call */
DumpData(1, 2);
有没有办法解决这个问题?
我试图编写一个具有可选参数的 C 函数,如果该参数没有“使用”,那么它有一个默认值。
int DumpData(int a, int b, int c=0)
{
if(c != 0)
{
//stuff
}
//banana
}
/* Function Call */
DumpData(1, 2);
有没有办法解决这个问题?
不,在 C 中没有办法做到这一点。你能做的最好的就是拥有单独的函数:
int DumpData(int a, int b)
{
return DumpDataABC(a, b, 0);
}
int DumpDataABC(int a, int b, int c)
{
...
}
或者,使用 C++ 而不是 C。
在 C 语言中,这可以通过宏来实现。这种东西的实现有点棘手,所以你最好使用现有的工具箱来做。我在P99中收集了这些东西。有了它,你可以定义类似
#define DumpData(...) P99_CALL_DEFARG(DumpData, 3, __VA_ARGS__)
#define DumpData_defarg_2() 0
第一行声明了一个宏,它应该接收 3 个参数。如果省略参数 2,则第二行用 a0
代替参数 2(参数计数从 0 开始)。
这样的宏实际上可以与您的函数命名相同,然后所有这些对调用方的用户都是透明的。
利用 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);