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

C main()函数可以是静态的吗?,c,static,linker,C,Static,Linker,能否在C程序中声明main()函数static?如果是的话,那它有什么用呢 如果我使用汇编代码并自己调用static main()函数(考虑嵌入式程序),是否可能?不,您不能这样做。如果你这样做,你将无法编译你的程序。因为静态函数只在同一个文件中可见,所以链接器将无法找到它并调用它。否。C规范实际上在其中的某个地方说(我读过规范,信不信由你)主函数不能是静态的 原因是static的意思是“不要让这个源文件之外的任何东西使用这个对象”。好处是,当您转到link时,它可以防止在C中发生名称冲突(如果

能否在C程序中声明
main()
函数
static
?如果是的话,那它有什么用呢


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

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

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

原因是static的意思是“不要让这个源文件之外的任何东西使用这个对象”。好处是,当您转到link时,它可以防止在C中发生名称冲突(如果在不同的文件中有两个全局变量都命名为“is_initialized”,那就糟糕了……除非您将它们设置为静态,否则它们会以静默方式合并)。它还允许编译器执行某些优化,否则它将无法执行这些优化。这两个原因就是为什么静态是一件好事

既然不能从文件外部访问静态函数,操作系统如何才能访问主函数来启动程序?这就是为什么main不能是静态的

有些编译器专门处理“main”,当您将其声明为静态时,可能会默默地忽略您


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

正如其他人所说,不,它找不到。如果你想把你的代码移植到C++,那就要加倍,因为C++标准指定主()不需要实际上是一个函数。p> 局部变量的静态表示它可以全局使用。 全局变量的静态表示只能在当前文件中使用

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

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

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

鉴于代码:

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

extern int x(int argc, char **argv)
{
    return(main(argc, argv));
}
GCC with-Wall说:

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

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

理论上,您可以使用-ffrerestanding来避免链接crt0.o(或crt1.o或crti.o,或是GCC在您的平台上使用的任何东西),编写您自己的引用main的_start,然后使main成为静态的。这与“如果你必须问“托管环境”是什么意思,那么你就在一个”是一致的:)+1非常好的回答,我只是想澄清根本原因,即存根链接在一起的事实,依赖于某些外部可见的符号,我认为标准只要求您具有外部
main
功能。它是否真的禁止其他翻译单元中的静态链接
main
?我认为这不准确。ISO/IEC 14882:2011第3.6.1节“主要功能”规定:程序应包含一个名为“主要”的全局功能,这是程序的指定开始。但我想知道这是如何允许的,并且应该如何工作
main()
是程序启动时需要调用的函数。一个程序中怎么可能有两个
main()
?即使在一个源文件中有一个
main()
,并且只在那里使用。链接器在哪里知道哪个
main()
是要在程序启动时调用的“主”函数(假设两者都没有冲突的原型)?@robertsupportsmonicacellio:可以在单独的翻译单元(对象文件)中使用两个同名函数,例如
widget\u picker()
只要其中至少有一个是静态的。相同的规则适用于名称
main()
。不同之处在于链接器查找非静态的
main()
(它不关心名为
main()
static
函数;它们在定义它们的TU之外不可见),并确保执行从可执行文件中(仅)非静态的
main()
开始“局部变量的静态意味着它可以全局使用”。你这是什么意思?它似乎不是对应用于局部变量的
static
的有效解释(指在函数中用
static
定义的变量)。