【问题标题】:Does C support optional null parameters?C 是否支持可选的空参数?
【发布时间】:2012-02-29 02:21:42
【问题描述】:

在 Python 中,我已经习惯了

def send_command(command, modifier = None):

然后修饰符参数是可选的,没有参数可以和0的参数区分开来。C中是否有类似的功能?我对 C 和谷歌搜索缺乏经验,但找不到关于如何在 C 中使用可选参数的明确说明。看来您可以类似地分配它们,如下所示:

void send_command(uint8_t command, uint8_t modifier = 0) {

所以第二个参数是可选的,如果不使用则默认为 0? (编辑:不,这无论如何都是无效的 C)

但是函数可以区分send_command(SOMETHING)send_command(SOMETHING, 0)吗?理想情况下,第二个参数可以是任何 uint8 值,包括 0。

也许 NULL 与 0 不同?

void send_command(uint8_t command, uint8_t modifier = NULL) {

【问题讨论】:

标签: c null optional-parameters function-declaration function-parameter


【解决方案1】:

正如其他人所说,C 不直接支持函数的默认参数。但是有一些方法可以用宏来做到这一点。 P99 有方便的“元”宏,使这个特性相对容易指定。例如,为了避免重复必须指定 pthread_mutex_init 函数的第二个参数:

P99_PROTOTYPE(int, pthread_mutex_init, pthread_mutex_t*, pthread_mutexattr_t const*);
#define pthread_mutex_init(...) P99_CALL_DEFARG(pthread_mutex_init, 2, __VA_ARGS__)
P99_DECLARE_DEFARG(pthread_mutex_init, , (pthread_mutexattr_t*)0);

然后直接使用

pthread_mutex_init(&my_mutex);

这里默认参数求值的语义与 C++ 相同,即默认参数的求值上下文就是声明的上下文。也有可能以评估的上下文是宏调用的上下文的方式来指定它。

【讨论】:

    【解决方案2】:

    可选参数在 C99 中可以使用可变参数宏:

    #define JUST3(a, b, c, ...) (a), (b), (c)
    #define FUNC(...) func(JUST3(__VA_ARGS__, 0, 0))
    

    现在FUNC(x) 扩展为func((x), (0), (0))FUNC(x,y) 扩展为func((x), (y), (0)),等等

    【讨论】:

    • 我不哭不笑
    • 您不想看到超载,是吗? ;-)
    • 不幸的是,FUNC(x,y,z,t) 扩展为 func((x), (y), (z)) 而不是错误。我觉得重要的是稍微惩罚那些想要超载的人。当他们最不期待的时候。
    • 完全合理。我认为最好的答案是“不,C 没有它们[除非你喜欢邪恶的预处理器黑客]。”
    • 模仿void send_command(int command = 1; int modifier = 0) 会很棘手,因为您在__VA_ARGS__ 之后立即添加的任何值都将用作任一参数的默认值。这是“默认参数”或“重载”的糟糕版本。显然 R.. 知道,这主要是出于兴趣。应该注意不要实际使用它的警告!
    【解决方案3】:

    正如其他人所说,C 没有可选参数。

    至于NULL0的区别there isn't much of one

    【讨论】:

    • 这取决于。将 NULL 定义为 (void *)0 对于大多数编译器而言,在传入整数参数时会导致“从指针转换为整数而不进行强制转换”警告。我觉得 C++ 委员会选择使用简单的 0 很奇怪,这甚至会破坏如果他们保留 C 定义会发生的最基本的类型检查。
    【解决方案4】:

    C 编程语言没有可选参数。 C++ 有,但“许多现代编程语言之母”C 没有……

    【讨论】:

      【解决方案5】:

      C 不支持可选参数。它也不支持经常用于类似效果的函数重载。

      【讨论】:

      • 这可能就是我找不到它的原因。所以我分配默认值 0 的示例仅在 C++ 中有效?
      • 正确。这在 C++ 中被称为默认参数。
      猜你喜欢
      • 1970-01-01
      • 2013-04-26
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 2012-01-25
      • 2012-12-31
      相关资源
      最近更新 更多