【问题标题】:Using "void" in C在 C 中使用“void”
【发布时间】:2011-09-06 19:08:34
【问题描述】:

我很困惑为什么我们需要将void 传递给 C 函数:

int f(void) { return 0; }

int f() { return 0; }

什么是正确的做法,为什么?

【问题讨论】:

    标签: c


    【解决方案1】:

    在 C 中,int f() 是旧式声明。它说f 需要一个固定但未指定数量和类型的参数。例如,给定int f() { return 0; },编译器不会抱怨f(42)f("hello, world")(尽管此类调用的行为未定义)。

    int f(void) 明确表示f 不接受任何参数。

    (C++ 有不同的规则;Stroustrup 并不关心与旧 C 代码的向后兼容性。)

    【讨论】:

      【解决方案2】:

      这是C的遗迹。

      f(void) 没有参数,所以f(1) 无效。

      f()表示参数未指定,所以f(1)在这里有效。

      【讨论】:

      • 它是“有效的”,因为编译器不需要抱怨它。但是如果f定义 没有指定任何参数,那么f(1) 的行为是未定义的。如果没有原型,则完全由程序员来确定参数的数量和类型是否正确。
      【解决方案3】:

      在这种情况下,void 仅表示“没有参数”。我不确定您的第二种情况是否会编译,但无论哪种方式,我都希望第一种情况尽可能清楚。当然,在调用f时,只需使用空括号即可:

      int x = f();
      

      【讨论】:

      • 是的,第二种情况会编译。这是一个没有原型的函数定义(包括函数声明)。支持与 pre-ANSI C 兼容。
      • @KeithThompson,我很高兴从 Keith Thompson 而不是从 Ken Thompson 那里得知这一点。 ;-)
      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 2014-08-10
      • 1970-01-01
      • 2014-03-20
      • 2012-11-02
      • 2015-12-06
      • 2011-05-22
      • 1970-01-01
      相关资源
      最近更新 更多