可能重复:
C void arguments
刚开始用C而我找不到答案...
之间有什么区别吗?
int foo() { }
int foo(void) { }
我应该选择哪个?为什么?
请注意,此问题也适用于:int main
。当我不想要任何命令行参数时,它应该是:int main
还是int main(void)
。
答案 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的兼容性。
总结一下:
f(void)
因为它强制执行更严格的输入。 (理性论证)f()
,否则你会破坏各种C ++专家。 (不合理的论点)答案 2 :(得分:1)
不,没有区别。在这种情况下,一些旧的C编译器会抱怨没有空白,但在现代C或C ++中没有理由这样做。
答案 3 :(得分:0)
这些陈述之间没有差异。
如果您编写int main(void)
,此语句会告诉编译器main
不包含任何参数。
同样,在main()
或int main()
的情况下,编译器再次理解main
不包含任何参数。但是,在第一种情况下,您强制告诉编译器,而在第二种语句中,编译器会自动理解。
答案 4 :(得分:0)
无论您是否使用命令行参数,main()的签名都包含允许访问命令行参数的参数。
将签名视为与调用者签订的合同,而不是实现实际使用内容的公告。
答案 5 :(得分:-1)
它们是相同的,但首选的是int foo() { }