C语言中main()函数的定义

11

可能是重复问题:
在C语言中定义无参函数main()的标准方式


我可以使用以下类似的函数main()的定义方式吗:

int main() {}

是的,我看到该标准规定只有两个版本得到了保证支持:

int main(void) {}

并且

int main(int argc, char* argv[]) {}

但是空括号呢?我知道它与C++中的含义不同(在C中,它表示此函数的参数数量和类型未知),但是我看到很多用这种方式定义main函数的C代码。

那么谁错了?


3
简短回答是:“你可能可以这样做,因为你的编译器可能设置得很宽松,但同时你应该避免尝试,因为这是轻微错误,会轻微影响可移植性,可能会触发编译器警告,并且没有任何好处。” - user240438
4个回答

10
在C语言中,int main();int main(void);这两个声明有所不同(前者声明一个具有未指定参数数量的函数,而后者实际上称为原型)。然而,在函数定义中,main()main(void)都定义了一个没有参数的函数。
另外一个签名main(int, char**)是一种替代形式。符合规范的实现必须接受任何一种形式,但也可以接受其他实现定义的main()签名。当然,任何给定程序只能包含一个名为main的函数。

想要提及 C99 标准中的 J.5 公共扩展部分吗?§J.5.1 环境参数 / ¶1 在托管环境下,main 函数接收第三个参数 char *envp[],该参数指向一个以空指针结尾的 char 指针数组,每个指针都指向一个字符串,该字符串提供有关程序执行环境的信息(5.1.2.2.1)。 - Jonathan Leffler
1
不是所有的第一句话都是正确的: main()可以带有未知数量的参数;只有main(void)不带参数。 - Federico
2
值得注意的是,虽然 int main() {...} 的定义确实定义了一个没有参数的函数,但它本身并没有引入 main 的原型。也就是说,在这样的定义之后,main 仍然被声明为具有未指定参数的函数。 "无参数" 部分仅影响 main 函数体。 - AnT stands with Russia
你的意思是在 C 语言中,空括号的放置位置有所不同 - 在函数声明或函数定义中?带有空括号的函数声明 - 表示该函数可以接受未指定数量和类型的参数,带有空括号的函数定义 - 表示该函数不需要任何参数。是这样吗?如果方便的话,您能否引用一下标准中的相关条文? - FrozenHeart
@NikitaTrophimov:链接的“可能重复”的主题提供了标准参考资料。 - Kerrek SB

3

int main() 和其他类似的函数声明都可以接受未知数量的参数,但对于主函数来说这是绝对错误的。正确的写法应该是 int main(void) ,它不需要任何参数。

char* argv[]量。当你在命令行中输入参数时,这些参数会被存储在这个字符串数组中。有时候也可以看到 char **argv,但其实是一样的。方括号 [] 是空的,因为我们不知道用户会输入多少参数,而 int argc 参数数就是为了解决这个问题:它统计了 argv 中有多少个参数(虽然列表以 argv[argc] == NULL 作为结束标志)。

还可以阅读这个链接了解一个通用的 foo()foo(void) 的区别。


1
作为一个声明,int main() 是有问题的;在函数定义中(其中也提供了函数体),它表示该函数不带参数,但没有提供函数的原型声明,因此如果您递归调用 main(),则无法防止您进行不正确的调用。这通常不是一个主要问题! - Jonathan Leffler
如果你在程序中的某个地方显式调用main函数,这绝对是错误的,这种情况可能比int main(){}更应该避免。 - AProgrammer

2
如果实现明确将int main()(没有参数)文档化为有效签名,则自 C99 以来一切都很好(§5.1.2.2.1 ¶1,“...或以某种其他实现定义的方式。”)。
如果实现没有对其进行说明,则严格地说,行为是未定义的(§4 ¶2),但在我的经验中,它会导致与int main(void)显着不同的行为的可能性非常小。

1
   int main() {}
   this is the standard prior to the c99 standard of main method.

   int main(void){}
   this is the standard coined by ANSI.

   int main(int argc, char* argv[]) {}     
   This is the another version of main which provides the user to pass the command line
   argument to the main method.

“int main(void)” 至少比你所说的早了10年。 - AProgrammer
我没有谷歌过,但不知怎么地我在某处读到了它。 - kTiwari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接