main()可以返回结构吗?

昨天在采访中有一个问题告诉我, main返回struct ? 我不知道任何人都可以告诉我是否有可能,如果是的话为什么?

main只能在C中返回一个int值(至少对于托管实现 )。

C标准的第5.1.2.2.1节说不:

程序启动时调用的函数名为main。 该实现声明此函数没有原型。 它应该定义为返回类型为int且没有参数:

 int main(void) { /* ... */ } 

或者使用两个参数(这里称为argc和argv,尽管可以使用任何名称,因为它们是声明它们的函数的本地名称):

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

或等效的;)或以其他一些实施方式定义的方式

你不能

如果main函数的返回类型是与int兼容的类型,则从初始调用返回main函数等效于调用exit函数,其中main函数返回的值作为其参数; 10)到达}终止main函数返回值0.如果返回类型与int不兼容,则返回到主机环境的终止状态未指定。

并且您无法将结构传递给main,因此最好将此结构写入二进制文件。 你想做什么?

编辑 (对于@effeffe):

 #include  struct st{float f;}; int main(void) { struct st x; xf = 3.14; return x; } 

返回

 demo.c: In function 'main': demo.c:9:5: error: incompatible types when returning type 'struct st' but 'int' was expected 

main只能在C / C ++中返回int 。 这与程序完成时返回状态代码的能力有关。 0表示成功, 1255表示特定错误。 程序会出现在文本文件或打印中的某种手册中,这些手册具有这些错误的含义,因此您可以确定程序无法运行的原因。 这是假设有人经历了错误检查和生成文档的努力。

由于main最初是从操作系统的程序加载器调用的,所以它不知道你要返回什么或者应该用它做什么。

因此,惯例是:返回一个整数。 无论使用何种语言或程序,这都为程序提供了与启动它的shell通信的通用接口。 这也意味着编写脚本的非技术用户可以使用此整数在其脚本中进行决策。

您可以执行所要求的最简单方法是将结构保存到文件中。 这样,任何了解结构数据的程序都可以访问该文件。

一个笑话回答:

很多人说没有,但我想是的! (有点)

您可以返回一个32位指针,然后将其转换为int,指向堆上的结构,假设int的大小为32位,并且您具有32位系统,以便指针的大小为32位也。

然后,相当危险,希望操作系统不会将该内存分配给另一个程序使用,并希望程序不会覆盖它。 如果你使用像Windows或Linux这样的操作系统,那么即使你没有释放内存,我的理解是,无论如何操作系统都会为你释放它。 (虽然你应该总是释放你的记忆,否则你就是一个肮脏的程序员!)

据我所知,另一个程序可以声明一个指向main()返回的位置的指针,然后逐字节地读取(现在已经消失的)struct中的内容。

我认为这应该有用吗? 是时候测试了! (这可能会出现严重错误,并且可能会发生许多未定义的事情。)

不要太认真地对待这个答案。 如果你提出建议,你可能会破坏你的就业机会。

正如其他人所指出的,如果main的返回值不是与int兼容的类型,则其值为“未指定”。 这意味着编译器可以使用返回值执行任何它喜欢的任何操作而不违反C标准,并且便携式 C程序不可能返回结构类型。 另一方面,C标准中没有任何内容要求编译器供应商不记录如果代码试图使main返回结构类型会发生什么,也不要求编译器记录的行为永远不会有用。 如果操作系统具有primaryReturnCodesecondaryReturnCode变量,并且编译器供应商想要指定返回包含两个int值的结构将导致第一个值存储在primaryReturnCode而第二个值存储在secondaryReturnCode ,则这样的规范将是完全合法的。

在C ++中,程序需要具有返回intmain函数。 还可以使用名称为main其他函数返回其他内容。 我不知道一个名为main但具有不同参数和从启动main函数返回类型的函数是否可以出现在与启动函数相同的上下文中,但是如果在类范围内没有其他函数称为main应该是允许的。