我们为什么不在main中使用(void)?

fud*_*din 32 c

人们用 void main() /*empty parens ()*/

我被教过要写 void main(void)

任何想法有什么区别?

Nol*_*rin 37

我不确定现在的标准是什么,但在传统的ANSI C中,使用空括号表示该函数可以使用任意数量的参数.void另一方面,声明一个参数表明该函数只接受零参数.在这种情况下(以及许多其他情况),它实在无关紧要.

如果你想要严格,最好定义void参数.当然,main函数也可以定义为int main(int argc, const char* argv[])- 这是完全有效的,但如果你不关心参数,通常是不必要的.

  • @fahad:除非你使用的是一个稍微不符合标准的C编译器,否则你不应该这样做.`main`返回`int`.如果你声明它是"无效",那么相关寄存器中剩下的任何内容将被视为你的程序的退出代码,这通常不是一件好事.正如Nicholas所说,如果你不使用参数,你可以编写`int main(void)`而不是完整的声明. (10认同)
  • @ Dummy00001:很久很久以前(计算机方面).:-)超过20年. (3认同)
  • @ninjalj定义便携!你完全错了.主要原型必须与启动代码假定的原型相匹配.并且`main(void)`意味着没有参数,并不会改变启动代码调用main的方式,因此对我来说更符合逻辑`main()`.如果启动代码已被编译为然后链接,`int main(void)`将引发__error__(不是警告!),请参阅我添加到我的答案中的代码 (3认同)
  • @ Dummy00001在ANSI C之前,"标准"K&R C中没有`void`关键字.假设没有返回类型的函数返回int. (2认同)
  • 我认为`main`的*real*定义也有环境的第三个参数,但几乎每个人都忽略了这一点.我错了吗? (2认同)
  • @Donal Fellows:那个是特定于实现的.如果你想要可移植性,你应该使用getenv(). (2认同)

Tim*_*fer 18

从C99标准:

5.1.2.2.1程序启动

程序启动时调用的函数名为main.该实现声明此函数没有原型.它应该使用int的返回类型定义,并且没有参数:

int main(void) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

或者有两个参数(这里称为argc和argv,虽然可以使用任何名称,因为它们是声明它们的函数的本地名称):

int main(int argc, char *argv[]) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

或同等学历; 或者以某种其他实现定义的方式.

当main没有参数定义时,argc和argv是否仍然存在于堆栈中?


Ger*_*ery 5

main()的这些原型都是非标准的.

关于该问题的精确度可以在comp.lang.c faq上找到:http://c-faq.com/decl/main.html

编辑:将"错误"改为"非标准",因为规范允许实现定义的原型.

  • @ShinTakezou:*仅*如果编译器文档**明确**表示支持`void main()`.如果没有,那么`main`应该返回`int`.有一些平台(Acorn是一个,我相信)将无法加载程序或程序终止崩溃,因为如果`main`键入`void`,堆栈框架设置不正确. (4认同)