【问题标题】:C function that accepts default arguments接受默认参数的 C 函数
【发布时间】:2013-06-05 21:06:04
【问题描述】:

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

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

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

/* Function Call */

DumpData(1, 2);

有什么办法可以解决这个问题吗?

【问题讨论】:

  • 一句话:没有。 C 不是 C++。

标签: c function default-arguments


【解决方案1】:

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

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

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

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

【讨论】:

  • 这似乎可以理解,但是当我尝试在我的代码中实现时,我无法弄清楚如何去做。那么如果用户不输入c,我应该调用什么函数呢?
  • @xRed:如果没有c,则调用双参数函数DumpData;如果有c,则调用三参数函数(我在这里称其为DumpDataABC;您可能会找到更好的名称,但如果没有更多上下文,我无法使用最佳名称)。这两个函数名必须不同,因为 C 没有函数重载。
【解决方案2】:

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

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

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

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

【讨论】:

  • 在-pedantic 下编译是否正确?这就是我现在正在尝试做的事情的绊脚石。
  • 您需要一个支持 C99 的编译器,事实上 P99 旨在完全符合 C99。例如,对于 gcc,这意味着您必须在命令行上使用 -std=c99 选项,而不是使用误导性命名的 -ansi 标志。
【解决方案3】:

利用 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-04-15
    • 1970-01-01
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多