【问题标题】:Use of 'void' in a function parameter [duplicate]在函数参数中使用“void”[重复]
【发布时间】:2011-02-22 07:59:41
【问题描述】:

可能重复:
C void arguments

我刚从 C 开始,我找不到答案...

有什么区别

int foo() { }

int foo(void) { }

我应该更喜欢哪个,为什么?

请注意,此问题也适用于:int main。当我不想要任何命令行参数时,应该是:int mainint main(void)

【问题讨论】:

标签: c


【解决方案1】:

根据标准,main 的两种规范形式是(参见 C99 第 5.1.2.2.2 节“程序启动”):

int main (void);
int main (int argc, char *argv[]); // or equivalent such as char **argv

其他是明确允许的,但那些是必需的。

至于fn(void)fn()之间的首选形式,我更喜欢前者,因为我喜欢明确声明没有参数。

还有一个细微的差别。 C99 第 6.7.5.3 节“函数声明符”第 10 段指出:

类型为 void 的未命名参数作为列表中唯一项的特殊情况 指定函数没有参数。

同一部分的第 14 段显示了唯一的区别:

标识符列表仅声明函数参数的标识符。作为该函数定义的一部分的函数声明器中的空列表指定该函数没有参数。不属于该函数定义的函数声明器中的空列表指定不提供有关参数数量或类型的信息。

换句话说,它的含义与函数定义中的void 相同,但 意味着在独立的声明符(即原型)中。 int fn(); 表示尚无参数信息,int fn(void); 表示无参数。

这意味着:

int fn();
int fn (int x) { return x; }
int main (void) { return fn(0); }

有效但是:

int fn(void);
int fn (int x) { return x; }
int main (void) { return fn(0); }

不是。

【讨论】:

  • 感谢您的回答。我可以从哪里下载标准以供参考?我似乎在搜索时点击了付费链接。
  • 您可以免费做的最好的事情可能是在维基百科页面的底部en.wikipedia.org/wiki/C99 或直接链接open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf - 这是 C99 + TCs 1、2 和 3 的草案。它是虽然读起来很枯燥:-)
  • 感谢您的精彩回答。
【解决方案2】:

除了 paxdiablo's reply,它涵盖了 C 语言和 OP 的问题,可能值得注意的是,至少 Bjarne Stroustrup 认为“空样式”在 C++ 中被认为是不好的做法。

原因纯粹是与风格有关,但在 ISO 标准化之前的早期,C++ 中实际上禁止使用 void 作为函数参数。不过最终允许使用 void 语法,以提供与 C 的兼容性。

总结一下:

  • 在 C 程序中,使用 f(void),因为它强制执行更严格的类型(有理参数)
  • 在 C++ 程序中,使用f(),否则你会惹恼各种 C++ 大师(不合理的论点)

【讨论】:

    【解决方案3】:

    不,没有区别。一些旧的 C 编译器会抱怨在这种情况下没有 void,但在现代 C 或 C++ 中没有理由这样做。

    【讨论】:

    • 我应该更喜欢哪一个?肯定有每个人都使用的那个!我什至下载了coreutils源代码来查看,但是每个main都有一个命令行参数!
    【解决方案4】:

    语句之间没有区别。

    如果你写int main(void),这个语句告诉编译器main不包含任何参数。

    同样,在main()int main() 的情况下,编译器再次理解main 不包含任何参数。但是,在第一种情况下,您是在强行告诉编译器,而在第二种情况下,编译器会自动理解。

    【讨论】:

    【解决方案5】:

    无论您是否使用命令行参数,main() 的签名都包括允许访问命令行参数的参数。

    将签名视为与调用者的合同,而不是实现实际使用的公告。

    【讨论】:

      【解决方案6】:

      它们是相同的,但首选的是int foo() { }

      【讨论】:

      • 为什么首选?它允许您将 Rubbish_t 类型的对象传递给函数 foo()。
      • 它们与 C 编译器不同。 foo(void) 表示该函数采用零参数。 foo() 表示该函数接受未知数量的参数。
      猜你喜欢
      • 2016-01-04
      • 2020-03-06
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 2018-07-27
      • 2012-03-21
      相关资源
      最近更新 更多