C main()函数可以是静态的吗?

时间:2009-05-29 08:02:39

标签: c static linker

可以在C程序中将main()函数声明为static吗?如果有,那么它的用途是什么?

是否可以使用汇编代码并自己调用static main()函数(考虑嵌入式程序)?

5 个答案:

答案 0 :(得分:35)

没有。 C规范实际上在其中的某处(我读过规范,信不信由你),主要功能不能是静态的。

原因是静态意味着“不要让此源文件之外的任何内容使用此对象”。好处是当你去链接时它可以防止C中的名字冲突(如果你有两个全局变量在不同的文件中被命名为“is_initialized”,那将是非常糟糕的...它们会被默默地合并,除非你制作它们静态的)。它还允许编译器执行某些优化,否则它将无法执行。这两个原因是为什么静态是一件好事。

由于您无法从文件外部访问静态函数,操作系统如何能够访问主函数来启动程序?这就是为什么主要不能是静态的。

有些编译器特别对待“main”,并且当你声明它是静态时可能会默默地忽略你。

编辑:看起来我错了,规范说主要不能是静态的,但它确实说它不能在托管环境中内联(如果你不得不问“托管环境”是什么意思,那么你在一个)。但是在OS X和Linux上,如果你声明main static,那么你会得到链接错误,因为链接器找不到“main”的定义。

答案 1 :(得分:9)

您可以在源文件中使用名为main() 静态函数,它可能会编译,但它不会 {{1}函数,因为当启动代码(许多(较旧的)Unix系统上的crt0.o)调用main()时,它对链接器是不可见的。

鉴于代码:

main()
GCC与-Wall有帮助地说:

static int main(int argc, char **argv)
{
    return(argv + argc);
}

extern int x(int argc, char **argv)
{
    return(main(argc, argv));
}

是的,可以做到。不,这通常是一个错误 - 它不是 warning: 'main' is normally a non-static function 函数。

答案 2 :(得分:2)

不,你不能这样做。如果你这样做,你将无法编译你的程序。因为静态函数只在同一个文件中可见,所以链接器将无法找到它并调用它。

答案 3 :(得分:0)

正如其他人所说,不,不能。如果您打算将代码移植到C ++,那么这会变得更加复杂,因为C ++标准指定main()实际上不需要是函数。

答案 4 :(得分:0)

C对'静态'有两个含义......

局部变量的

静态意味着它可以全局使用。 全局变量的静态意味着只能在当前文件中使用。

static for functions与将全局变量表示为静态具有完全相同的影响...静态函数仅在当前文件中可见...

因此,main永远不会是静态的,因为它无法作为程序的主要入口点。