void main() { } 在没有头文件的情况下完美运行.怎么会这样,主函数的定义用C写在哪里?



我写了以下代码:

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实现,编译器确切地知道这意味着什么,你只是指定了它。

相关内容

  • 没有找到相关文章

最新更新