C23标准中int main()与int main(void)是否为等效原型?
C23中
int main()算不算合法的无参数main函数定义? 先理清楚两个关键标准条款
- C23的6.7.6.3第13点明确:不带参数类型列表的函数声明器(也就是
()),效果完全等同于用void当参数类型列表,而且会给函数生成原型。换句话说,普通函数里void func()和void func(void)在C23里是一回事。 - 但对于
main函数,5.1.2.2.1(程序启动)条款的要求是:无参数时要写成int main(void),或者用带两个参数的标准形式、等效形式、实现定义的形式。
关于int main()的合法性
虽然C23把普通函数的()和(void)划了等号,但结合两个细节来看:
- 标准对
main的表述特意强调“应写为int main(void)”,没有直接把int main()列进去; - C23草稿直接把C17里两处用
int main()的示例改成了int main(void)。
这说明:
- 从语法语义上,
int main()在C23里确实和int main(void)等效(符合6.7.6.3的规则),属于合法的“等效定义”; - 但标准制定者明显更推荐用
int main(void)——一方面是因为C23之前的标准里,int main()是旧式无原型声明,可能引发参数传递问题;另一方面统一写法能在所有C版本里保持兼容,避免不必要的混淆。
结论
- 合法:C23中
int main()是int main(void)的等效定义,符合标准要求; - 推荐写法:优先用
int main(void),既能对齐标准的明确指引,也能保证跨C版本的兼容性和可读性。
内容的提问来源于stack exchange,提问作者chqrlie
相关产品推荐
相关产品推荐

