void main(){}在没有头文件的情况下完美工作。这怎么可能发生,用C写的主函数的定义在哪里?
C标准(5.1.2.2.1程序启动)
1名为在程序启动的功能被命名为主力。 T 他 实现声明此函数没有原型。应当 带有int返回类型和不带参数定义:
int main(void) { /* ... */ }
或具有两个参数(此处称为argc和argv,尽管可以使用任何 名称,如他们是本地的中,他们 声明的功能):
int main(int argc, char *argv[]) { /* ... */ }
或等同物; 10)或以某种其他实施方式定义的方式。
虽然一些编译器,例如MS VS的编译器支持与返回类型void
然而这样的声明函数main的声明并不是函数main的C标准声明。
因此,如果实现声明没有函数main的原型,并且如果函数main不调用任何其他函数,则不需要头。
你可能只写
int main(void)
{
}
return语句也可以省略。
请注意,它是定义函数main的用户。所以在上面介绍的程序中有一个main函数的定义,它的主体中不包含任何语句。该函数不会执行任何操作,并立即将控件返回到托管环境。
如果您的代码中没有标头使用printf
,编译器不知道您要引用的是哪种类型的实体。
如果您提供的main
,编译器确切知道这意味着什么,您只是指定它。
void
是一种内置类型,由编译器知道。 main
是程序的入口点,而你写的printf
需要一些原型。如果您在源代码中编写自己的printf
定义,它将在没有标题的情况下编译。
编译C程序唯一要做的就是指定一个入口点,即main
。
标题只是提供其他IO的可能性。
void printf()
{
}
int main()
{
printf();
}
并且用'void'声明'main'具有未定义的/实现定义的行为,所以它根本不需要工作。重新定义'printf'也有不确定的行为。 –
Ofc我知道它,它只是解释这些程序编译是如何工作的,你不能将实现定义/未定义行为等东西纠缠到初学者头部。感谢downvote无论如何:-)。 –
关键是它是完全有效的*不*编译 –
头文件只是一种语言功能,它提供了在不同模块(翻译单元)或甚至整个库中组织代码的方法。它们绝不是强制性的使用。
C程序中唯一强制的要求是有一些入口指向你的程序的方式。在托管系统(例如具有OS的PC)上,该入口点必须是名为main()
的函数。它可以用几种方式来声明。 void main()
不保证工作,除非编译器明确支持该表单。最便携和标准化的格式是:
int main (void)
{
return 0;
}
当然,这个程序当然不是很令人兴奋的运行,因为它什么都没有。但它是完全有效的。
不需要main()的任何前向声明。对于独立环境,入口点的格式完全由实现定义。对于托管环境,C标准明确指出:“该实现没有声明该函数的原型。” - 这种情况下的实现意味着编译器。用英语表示main()
函数必须在没有任何以前的声明的情况下工作,按照语言定义。
另请注意,'void main()'是一种过时的格式,在未来的语言版本中可能无法使用。只有'void main(void)'保证将来能够工作。 – Lundin
你必须编写'main()'的定义,并且做到了。 –
所以是printf.But我们有它,main()@FilipKočica –
你需要运行一个C程序的唯一东西是一个'main'函数,在没有包含头文件IO,但你不需要它们 –