可以在C程序中将main()
函数声明为static
吗?如果有,那么它的用途是什么?
是否可以使用汇编代码并自己调用static main()
函数(考虑嵌入式程序)?
答案 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永远不会是静态的,因为它无法作为程序的主要入口点。