代码之家  ›  专栏  ›  技术社区  ›  bjskishore123

main()函数返回值的强制转换如何工作?

c c++
  •  1
  • bjskishore123  · 技术社区  · 15 年前

    我正在使用Visual Studio 2008。 下码

    double main()
    {
    }
    

    我得到错误:

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

    但是如果我用下面的代码

    char main()
    {
    }
    

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

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

    问题:编译器是否执行从默认返回值0(整数)到char的隐式强制转换?

    代码0xCCCC000是如何生成的?

    代码中的最后一个字节似乎是实际返回值。为什么要来0xCCCCC?

    7 回复  |  直到 15 年前
        1
  •  2
  •   Eric Mickelsen    15 年前

    你第一个问题的答案是肯定的。char本质上是一个非常小的整型,因此编译器非常宽松。double不可接受,因为它不是整数类型。0xCCCCC是从未初始化过的内存(调试目的除外)。因为ASCII字符只能有两个十六进制数字,所以转换根本无法设置前24位(并且只将最后8位设置为0)。这是一个多么奇怪和不受欢迎的编译器技巧。

        2
  •  5
  •   Michael Goldshteyn    15 年前

    按照C++标准的正确做法是:

    int main()
    {
    ...
    }
    

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

        3
  •  4
  •   Community CDub    8 年前

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

    你可以参考一篇有用的文章:

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

        4
  •  3
  •   Armen Tsirunyan    15 年前

    又一个MSVC扩展/错误!

        5
  •  2
  •   Chubsdad    15 年前

    关于主功能,$3.6.1/2-“IT 应具有int类型的返回类型, 但除此之外,它的类型是 已定义实现。”

    据我所知,在标准文档中提到“应”而代码没有指示的任何内容都是编译器需要诊断的即时条件,除非标准明确规定不需要此类诊断。

    所以我猜如果允许这样的代码,vs有一个bug。

        6
  •  1
  •   nmichaels    15 年前

    这个 main 函数应该返回一个int。不这样做意味着您在未定义的区域中。别忘了在过去的路上按标准挥手。您的char返回可能有效,因为char可以很容易地转换为int。double当然不能。它们不仅更长(是长度的两倍),而且是浮点数,这意味着在不稳定的地方会有1个。

    简短回答:不要这样做。

        7
  •  1
  •   Nick Meldrum    15 年前

    这可能是因为char将隐式转换为int,但是double不会像数据丢失那样进行转换。

    (见此处: http://msdn.microsoft.com/en-us/library/y5b434w4%28v=VS.71%29.aspx 更多信息)

    但是,您不会看到转换问题,因为编译器捕获了使用非标准返回类型的最坏罪恶(如其他答案中所述)。