在函数参数中使用void

时间:2011-02-22 07:59:41

标签: c

  

可能重复:
  C void arguments

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

之间有什么区别吗?
int foo() { }

int foo(void) { }

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

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

6 个答案:

答案 0 :(得分:15)

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相同,但 not 表示在独立声明符(即原型)中。 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); }

不是。

答案 1 :(得分:4)

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

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

总结一下:

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

这些陈述之间没有差异。

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:-1)

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