在函数参数中使用void

可能重复:
C void参数

刚开始用C而我找不到答案……

两者之间有什么区别吗?

int foo() { } int foo(void) { } 

我应该选择哪个?为什么?

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

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

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

其他人是特别允许的,但那些是必需的。

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

还有一个微妙的区别。 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); } 

不是。

除了paxdiablo的回复,其中涵盖了C语言以及OP的问题,可能值得注意的是,“void style”在C ++中被认为是不好的做法,至少Bjarne Stroustrup。

纯粹与样式相关的原因,但在ISO标准化之前的早期,实际上禁止使用void作为函数参数。 尽管最终允许使用void语法,以提供与C的兼容性。

总结一下:

  • 在C程序中,使用f(void)因为它强制执行更严格的键入。 (理性论证)
  • 在C ++程序中,使用f() ,否则你会破坏各种C ++专家。 (不合理的论点)

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

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

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

这些陈述之间没有差异。

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

类似地,在main()int main() ,编译器再次理解main不包含任何参数。 但是,在第一种情况下,您强制告诉编译器,而在第二种语句中,编译器会自动理解。

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