昨天面试的时候有人问我一个问题,可以main
回复struct
吗?我不知道有人能告诉我这是否可能,如果是,为什么?
7 回答
main
只能返回int
C 中的值(至少对于托管实现)。
C 标准的第 5.1.2.2.1 节说不:
程序启动时调用的函数名为 main。实现没有声明这个函数的原型。它应定义为返回类型为 int 且不带参数:
int main(void) { /* ... */ }
或者带有两个参数(这里称为 argc 和 argv,尽管可以使用任何名称,因为它们是声明它们的函数的局部变量):
int main(int argc, char *argv[]) { /* ... */ }
或等效的;)或以其他一些实现定义的方式
你不能
如果 main 函数的返回类型是与 int 兼容的类型,则从初始调用到 main 函数的 return 等价于以 main 函数返回的值作为参数调用 exit 函数;10)到达 }终止 main 函数返回值 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
只能int
在 C/C++ 中返回。这与程序完成时返回状态码的能力有关。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++ 中,程序需要有一个main
返回int
. 也有可能具有main
返回其他事物的名称的其他函数。我不知道一个被命名main
但与启动函数具有不同参数和返回类型的main
函数是否可以出现在与启动函数相同的上下文中,但如果没有其他调用的函数main
应该在类范围内是允许的。