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

udp*_*nil 17 c linker static

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

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

Die*_*Epp 35

不,C规范实际上在其中的某个地方(我读了规范,不管你信不信),主要功能不能是静态的.

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

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

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

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

  • 从理论上讲,你可以使用-ffreestanding来避免链接crt0.o(或crt1.o或crti.o或者GCC在你的平台上使用的任何东西),编写你自己的_start引用main,然后make main static.这与'如果你必须问什么"托管环境"的意思,然后你在一个'虽然:) (3认同)
  • 我认为该标准只要求您有一个外部“main”函数。它实际上禁止其他翻译单元中的静态链接“main”吗? (2认同)

Jon*_*ler 9

你可以有一个叫做静态函数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));
}
Run Code Online (Sandbox Code Playgroud)

海湾合作委员会与-Wall有帮助地说:

 warning: 'main' is normally a non-static function
Run Code Online (Sandbox Code Playgroud)

是的,可以做到.不,这通常是一个错误-这是不是 main()功能.