如何转换main()函数的返回值?

时间:2010-10-14 15:21:19

标签: c++ c

我正在使用Visual Studio 2008。 以下代码

double main()
{
}

我收到错误:

  

错误C3874:返回'main'类型   应该是'int'而不是'double'

但如果我使用下面的代码

char main()
{
}

没有错误。 运行并退出输出窗口后显示

  

程序'[5856] test2.exe:Native'   已退出,代码为-858993664   (0xcccccc00)。

问题:编译器是否从默认返回值零(整数)到char?

进行隐式转换

如何生成代码0xcccccc00?

看起来该代码中的最后一个字节似乎是实际的返回值。为什么0xcccccc即将到来?

7 个答案:

答案 0 :(得分:5)

根据C ++标准,正确的方法是:

int main()
{
...
}

不要将返回类型更改为其他任何内容,否则您的代码将不是C ++,而您只是在使用编译器特定的功能。您的示例中的那些ccccc值只是返回的单位化字节(C分配器设置为0xCC)。

答案 1 :(得分:4)

从main函数返回的值成为进程的退出状态,尽管C标准仅将两个值的特定含义归为:EXIT_SUCCESS(传统上为零)和EXIT_FAILURE。其他可能的返回值的含义是实现定义的。但是,没有关于如何解释非零代码的标准。

您可以参考一个有用的帖子:

What should main() return in C and C++?

答案 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了解更多信息)

但是,您没有看到转换问题,因为编译器捕获了使用非标准返回类型的最严重的错误(如其他答案中所述)。