我写了以下代码:
void main() {
}
它如何在没有任何头文件的情况下运行?
来自 C 标准(5.1.2.2.1 程序启动(
1 程序启动时调用的函数名为 main。The 实现没有声明此函数的原型。它应该是 使用 int 返回类型定义且不带参数:
int main(void) { /* ... */ }
或带有两个参数(此处称为 argc 和 argv,尽管任何 可以使用名称,因为它们是它们所在的函数的本地名称 声明(:
int main(int argc, char *argv[]) { /* ... */ }
或同等学历;10(或以某种其他实现定义的方式。
尽管某些编译器(例如MS VS的编译器(支持使用返回类型声明函数mainvoid
但这种声明不是函数main的C标准声明。
因此,由于实现没有声明函数 main 的原型,并且如果函数 main 不调用任何其他函数,则不需要任何标头。
你可以只写
int main( void )
{
}
也可以省略返回语句。
请注意,定义函数 main 的是用户。因此,在上面介绍的程序中,有一个函数 main 的定义,其主体内不包含任何语句。该函数不执行任何操作,并立即将控件返回到托管环境。
头文件只是一种语言功能,它提供了在不同模块(翻译单元(甚至整个库中组织代码的方法。它们绝不是强制性的。
在 C 程序中唯一必需的是具有某种形式的程序入口点。在托管系统(例如具有操作系统的 PC(上,此入口点必须是名为main()
的函数。可以通过多种方式声明它。 除非编译器明确支持该形式,否则不能保证void main()
工作。最便携和标准化的格式是:
int main (void)
{
return 0;
}
当然,这个程序运行起来不是很令人兴奋,因为它绝对不做任何事情。但它是完全有效的。
不需要任何 main(( 的前向声明。对于独立环境,入口点的格式完全由实现定义。对于托管环境,C 标准明确指出"实现没有声明此函数的原型"——在这种情况下,实现是指编译器。在英语中,这意味着根据语言定义,main()
函数必须简单地工作,没有任何先前的声明。
有关 main(( 的各种允许形式的详细信息。
void
是一个内置类型,由编译器所知。main
是程序的入口点,而printf
,正如您所写的,需要一些原型。如果您在源代码中编写自己的printf
定义,它将在没有标头的情况下进行编译。
编译 C 程序唯一需要做的就是指定一个入口点,即main
.
标头仅提供其他 IO 可能性。
void printf()
{
}
int main()
{
printf();
}
如果您在没有标头的代码中使用printf
,编译器将不知道您引用的实体类型。
如果你提供main
的实现,编译器确切地知道这意味着什么,你只是指定了它。