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

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

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

不,C规范实际上在其中的某个地方(我读过规范,信不信由你)说主要function不能是静态的。

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

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

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

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

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

鉴于代码:

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

GCC与-Wall有帮助地说:

  warning: 'main' is normally a non-static function 

是的,可以做到。 不,这通常是一个错误 – 它不是main()函数。

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

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

C对“静态”有两个含义……

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

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

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