为什么带有静态main()类型的程序显示错误?

#include static int main() { printf("foo"); return 0; } 

代码给出了错误

 nfo):重定位12具有无效符号索引13
 / usr / bin / ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info):重定位13具有无效的符号索引13
 / usr / bin / ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info):重定位14具有无效的符号索引13
 / usr / bin / ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info):重定位15具有无效的符号索引13
 / usr / bin / ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info):重定位16具有无效的符号索引13
 / usr / bin / ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info):重定位17具有无效的符号索引13
 / usr / bin / ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info):重定位18具有无效的符号索引13
 / usr / bin / ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info):重定位19具有无效的符号索引21
 / usr / bin / ld:/usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line):重定位0具有无效的符号索引2
 /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o:在函数`_start'中:
 (.text + 0x20):对'main'的未定义引用
 collect2:错误:ld返回1退出状态

错误背后的原因是什么?

在C中, static是“隐藏”实现细节的主要方式。 在C中标记函数或变量static意味着将其可见性限制为定义它的转换单元。 实质上,只有同一个C文件中的函数才能引用它们。 其他文件或库中的函数无法访问它们。

因为函数main需要从你的环境的启动代码(一段代码“引导你的程序执行”)中访问,所以隐藏它会使你的程序不可链接:编译器试图找到main ,但它是隐藏的,所以链接器发出错误。

它显示错误,因为您的程序中没有正确的主函数。 main()在C和C ++中都不能是静态的。 static存储说明符表示该函数仅在此转换单元中可见,并且C运行时环境无法访问它:

 prog.c:3:12: warning: 'main' is normally a non-static function [-Wmain] static int main() ^ prog.c:3:12: warning: 'main' defined but not used [-Wunused-function] /usr/lib/gcc/i586-linux-gnu/4.9/../../../i386-linux-gnu/crt1.o: In function `_start': (.text+0x18): undefined reference to `main' collect2: error: ld returned 1 exit status 

static int main()在C或C ++中都不是正确的签名。 C ++中main签名

 int main() { / ... / } int main(int argc, char* argv[]) { / ... / } 

在C.

 int main(void) { / ... / } int main(int argc, char* argv[]) { / ... / }