我正在使用Visual Studio 2008。 以下代码
double main()
{
}
我收到错误:
错误C3874:返回'main'类型 应该是'int'而不是'double'
但如果我使用下面的代码
char main()
{
}
没有错误。 运行并退出输出窗口后显示
程序'[5856] test2.exe:Native' 已退出,代码为-858993664 (0xcccccc00)。
问题:编译器是否从默认返回值零(整数)到char?
进行隐式转换如何生成代码0xcccccc00?
看起来该代码中的最后一个字节似乎是实际的返回值。为什么0xcccccc即将到来?
答案 0 :(得分:5)
根据C ++标准,正确的方法是:
int main()
{
...
}
不要将返回类型更改为其他任何内容,否则您的代码将不是C ++,而您只是在使用编译器特定的功能。您的示例中的那些ccccc值只是返回的单位化字节(C分配器设置为0xCC)。
答案 1 :(得分:4)
从main函数返回的值成为进程的退出状态,尽管C标准仅将两个值的特定含义归为:EXIT_SUCCESS(传统上为零)和EXIT_FAILURE。其他可能的返回值的含义是实现定义的。但是,没有关于如何解释非零代码的标准。
您可以参考一个有用的帖子:
答案 2 :(得分:3)
又一个MSVC扩展/错误!
答案 3 :(得分:2)
你的第一个问题的答案是肯定的。 char本质上是一个非常小的整数类型,因此编译器(非常)宽松。 Double是不可接受的,因为它不是一个整体类型。 0xCCCCCC是永远不会被初始化的内存(除了调试之外)。由于ASCII字符只能有两个十六进制数字,因此转换根本不能设置前24位(并且只将最后8位设置为0)。多么奇怪和不受欢迎的编译技巧。
答案 4 :(得分:2)
关于主要功能,$ 3.6.1 / 2 - “它 应具有int类型的返回类型, 但其他类型是 实现定义“。
据我所知,任何在标准文件中提及“并且”不会被代码所提及的内容都是编译器需要诊断的即时条件,除非标准明确规定不需要此类诊断。 / p>
所以我猜VS如果允许这样的代码就有bug。
答案 5 :(得分:1)
main
函数应该返回一个int。不这样做意味着你在未定义的领域。不要忘记在过去的路上挥动标准。您的char返回可能有效,因为char可以很容易地转换为int。双打肯定不会。它们不仅长(长度加倍),而且它们是浮点数,这意味着你将在不稳定的地方拥有1个。
简短的回答:不要这样做。
答案 6 :(得分:1)
可能是因为char会隐式转换为int,但是不会因为数据丢失而加倍。
(请参阅此处:http://msdn.microsoft.com/en-us/library/y5b434w4%28v=VS.71%29.aspx了解更多信息)
但是,您没有看到转换问题,因为编译器捕获了使用非标准返回类型的最严重的错误(如其他答案中所述)。