>昨天在采访中有人问我一个问题,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 函数的初始调用返回等效于 使用 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
main
只能在 C/C++ 中返回int
。这与程序完成时返回状态代码的能力有关。 0
意味着成功,而1
255
意味着特定的错误。程序会在文本文件或打印中出现某种排序手册,这些手册将具有这些错误的含义,以便您可以确定程序无法运行的原因。这是假设有人经历了错误检查并生成文档的努力。
由于 main 最初是从操作系统的程序加载器调用的,因此它不知道您要返回什么或应该用它做什么。
因此,约定是:返回一个整数。无论什么语言,或者什么程序,这都为程序提供了一个通用接口,以便与启动它的 shell 进行通信。这也意味着编写脚本的非技术用户可以使用此整数在其脚本中做出决策。
执行要求的最简单方法是将结构保存到文件中。这样,任何知道结构数据的程序都可以访问该文件。
一个笑话答案:
很多人说不,但我认为是的!(有点(
您可以返回一个 32 位指针,然后将其转换为指向堆上的结构的 int,假设 int 的大小为 32 位,并且您有一个 32 位系统,因此指针的大小也是 32 位。
然后,相当危险的是,希望操作系统不会将该内存分配给另一个程序使用,并希望该程序不会覆盖它。如果您使用Windows或Linux之类的操作系统,那么我的理解是即使您不释放内存,那么操作系统无论如何都会为您释放内存。(当然,虽然你应该总是释放你的记忆,否则你就是一个肮脏的程序员!
据我所知,另一个程序可以声明一个指向 main(( 返回的位置的指针,然后逐个字节读取(现已消失(结构中的内容。
我认为这应该有效吗?是时候测试一下了!(这可能会出错,并且可能会发生许多未定义的事情。
不要把这个答案太当回事。如果你建议它,你可能会毁了你的就业机会。
正如其他人所指出的,如果main
的返回值不是与int
兼容的类型,则其值为"未指定"。 这意味着编译器可以在不违反 C 标准的情况下对返回值执行它喜欢的任何操作,并且可移植 C 程序不可能返回结构类型。 另一方面,C 标准中没有任何内容要求编译器供应商不记录如果代码尝试main
返回结构类型时会发生什么情况,也不要求编译器记录的行为永远不会有用。 如果操作系统具有primaryReturnCode
和secondaryReturnCode
变量,并且编译器供应商想要指定返回包含两个int
值的结构将导致第一个值存储在primaryReturnCode
中,第二个值存储在secondaryReturnCode
中,则这样的规范将是完全合法的。
在C++中,程序需要具有返回int
的main
函数。 也可以有其他名为 main
的函数返回其他内容。 我不知道一个名为 main
但具有不同参数和来自启动main
函数的返回类型的函数是否可以出现在与启动函数相同的上下文中,但如果没有其他函数,则调用 main
的函数应该在类范围内是允许的。