C++主函数和C主函数的区别

4

我正在阅读一篇有关C++与C的文档。其中提到,相比于C语言,C ++写得更紧凑。举个例子,C语言允许main()函数的类型为void,但是C++不允许。以下是标准中的相关规定:

C++标准中规定:

It shall have a return type of int, but otherwise its type is implementation-defined. All implementations shall allow both of the following definitions of main:

int main() { /* … */ }

and

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

标准C语言也说了同样的话,但是还有一句额外的声明。

如果返回类型与int不兼容,则返回给宿主环境的终止状态是未指定的

这表明允许不返回int的形式是有意的。

当你有了“类型可以是实现定义的”这个声明,难道不是为C++编译器实现社区留下了允许void作为类型的余地吗?


C语言中的main函数必须始终返回int类型。 - Flexo
你正在阅读哪份文档呢?标准的C语言并不比标准的C++语言“紧凑”得少。 - fredoverflow
C语言的iso/iec 9899:1999 5.1.2.2.1和5.1.2.2.3,以及C++的iso/iec 14882:1998。 - Ram
@awoodland:请看Kerrek的答案... - Oliver Charlesworth
@awoodland,gcc编译器没有对语句void main(void) 抱怨。但是 g++ 对于语句void main (void),报错:main必须返回一个int。 - Ram
2
@ram,在测试gcc的标准兼容性时,一定要使用-pedantic-errors。这样,gcc 4.6.2就会显示:"error: return type of ‘main’ is not ‘int’ [-Wmain]" - Matthew Flaschen
2个回答

14

C语言和C++语言都要求语言实现必须支持形式为int main(void)int main(int, char**)的写法。然而,标准还表示实现可以支持其他形式,因此使用这些其他形式的程序不是无效的——相反,这是一种在某些平台上支持的合法程序。

C语言和C++语言的唯一区别在于允许哪些main的替代形式。在C++中,所有形式都必须返回int,因此只允许参数有所变化,而且,如果任何形式的前两个参数是int, char**,它们应该具有通常的含义。

C语言则更加自由,允许任何替代形式的main。因此,带有void main(char, double)的程序是一个有效的C程序,需要实现支持这个签名,而这个签名在C++中将无条件视为不良形式。另一方面,int main(int, char**, char**)是C和C++都允许的签名,同样需要实现支持,而C++将期望前两个参数具有通常的含义。


@ kerrek SB,现在可以安全地假设,在main()函数必须始终返回一个值且其类型必须为'int'的条件下,C++具有支持所有main()变体的能力。而对于C语言中的main()函数则没有这样的限制。 - Ram
1
@ram:不要误解:C++是一种抽象的语言标准。它本身没有任何“能力”。它只是一个正式的文件。它所说的是,如果你的代码具有任何允许的main形式之一,则它是格式良好的,但是你只能期望任何给定的编译器在它具有两种标准形式之一时对其进行编译。否则,你的编译器必须显式地支持你的形式。 - Kerrek SB

7

C++

该函数的返回类型必须是int,但其他类型由实现定义。

这意味着返回类型必须是int,但main函数的参数可以由实现定义。因此,main函数具有实现特定的参数范围,但不存在从int返回类型中变化的范围。

C

C对于main函数允许的返回类型更加宽容,它允许除int外的其他返回类型。


你是指命令行参数吗?能否详细说明一下你的意思?谢谢。 - Ram
1
main函数的形式参数可以由实现定义。但返回值类型不能。它必须是int。 - David Heffernan

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