为什么带有静态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[]) { / ... / }