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

标签 c static linker

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

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

最佳答案

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

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

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

有些编译器会特别对待“main”,当您将其声明为静态时,可能会默默地忽略您。

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

关于C main() 函数可以是静态的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/924890/

相关文章:

C Switch语句输出两种情况

c# - 引用静态类中的实例化对象 (c#)

c++ - 具有相同名称的静态变量的开关案例的单独范围

c++ - 模板类,导致链接问题的实现代码

ios - 是什么导致 iOS 链接错误?

c - 如果有的话,使用函数指针参数和该函数的参数或反之亦然的技术原因是什么?

c - C 中没有 fork 的无名管道

c - 什么 C 编译器与 Borland Turbo Link 5.1 匹配?

c - 如何将指针数组转换为字符数组?

c# - 如何用抽象基础修复 "CA1810: Initialize reference type static fields inline"...?