main()可以返回结构吗?

时间:2013-06-23 16:14:10

标签: c struct main

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

7 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:6)

C标准第5.1.2.2.1节说不:

  

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

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

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

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

或等同物;)或其他一些实施方式

答案 2 :(得分:2)

不,你不能

  

如果main函数的返回类型是与int兼容的类型,   从初始调用到main函数的返回相当于   使用main函数返回的值调用exit函数   作为其论点; 10)到达终止主要功能的}   返回值0.如果返回类型与int不兼容,   返回到主机环境的终止状态是   未指定的。

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

修改(适用于@effeffe):

#include <stdio.h>

struct st{float f;};

int main(void)
{
    struct st x;
    x.f = 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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

一个笑话回答:

很多人说不,但我想是的! (排序)

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

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

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

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

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

答案 6 :(得分:0)

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

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