オプションの引数を持つ 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++ を使用します。
In C, this can be achieved with macros. The implementation of such a thing is a bit tricky, so you'd better use an existing toolbox to do so. I have collected such things in P99. With that you could define something like
#define DumpData(...) P99_CALL_DEFARG(DumpData, 3, __VA_ARGS__)
#define DumpData_defarg_2() 0
The first line declares a macro that is supposed to receive 3 parameters. The second line substitutes a 0
in place of parameter 2, if that one is omitted (parameter count starts with 0).
Such a macro can in fact be named the same as your function, all of this is then transparent to the user at the calling side.
可変引数マクロ、指定された初期化子、複合リテラルなどの 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);