void main(){}在没有头文件的情况下完美工作。这怎么可能发生,用C写的主函数的定义在哪里?

问题描述:

我写了下面的代码:void main(){}在没有头文件的情况下完美工作。这怎么可能发生,用C写的主函数的定义在哪里?

void main() { 

} 

它如何运行,没有任何的头文件?

+3

你必须编写'main()'的定义,并且做到了。 –

+0

所以是printf.But我们有它,main()@FilipKočica –

+0

你需要运行一个C程序的唯一东西是一个'main'函数,在没有包含头文件IO,但你不需要它们 –

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函数的定义,它的主体中不包含任何语句。该函数不会执行任何操作,并立即将控件返回到托管环境。

+0

什么让你认为这是一个托管环境?看到这个:https://*.com/a/31263079/584518 – Lundin

+0

@Lundin如果它不是托管环境,那么问题的作者提到了这一点。 –

+0

我的观点是它引用了关于托管环境的_sub-chapter_,忽略了其他形式的main()是完全正确的。所以这个报价并不能证明main()的格式,只是显示了托管系统的一些通用格式。 – Lundin

如果您的代码中没有标头使用printf,编译器不知道您要引用的是哪种类型的实体。

如果您提供main,编译器确切知道这意味着什么,您只是指定它。

void是一种内置类型,由编译器知道。 main是程序的入口点,而你写的printf需要一些原型。如果您在源代码中编写自己的printf定义,它将在没有标题的情况下编译。

编译C程序唯一要做的就是指定一个入口点,即main

标题只是提供其他IO的可能性。

void printf() 
{ 

} 

int main() 
{ 
    printf(); 
} 
+2

并且用'void'声明'main'具有未定义的/实现定义的行为,所以它根本不需要工作。重新定义'printf'也有不确定的行为。 –

+1

Ofc我知道它,它只是解释这些程序编译是如何工作的,你不能将实现定义/未定义行为等东西纠缠到初学者头部。感谢downvote无论如何:-)。 –

+0

关键是它是完全有效的*不*编译 –

头文件只是一种语言功能,它提供了在不同模块(翻译单元)或甚至整个库中组织代码的方法。它们绝不是强制性的使用。

C程序中唯一强制的要求是有一些入口指向你的程序的方式。在托管系统(例如具有OS的PC)上,该入口点必须是名为main()的函数。它可以用几种方式来声明。 void main()不保证工作,除非编译器明确支持该表单。最便携和标准化的格式是:

int main (void) 
{ 
    return 0; 
} 

当然,这个程序当然不是很令人兴奋的运行,因为它什么都没有。但它是完全有效的。

不需要main()的任何前向声明。对于独立环境,入口点的格式完全由实现定义。对于托管环境,C标准明确指出:“该实现没有声明该函数的原型。” - 这种情况下的实现意味着编译器。用英语表示main()函数必须在没有任何以前的声明的情况下工作,按照语言定义。

Details regarding the various allowed forms of main()

+0

另请注意,'void main()'是一种过时的格式,在未来的语言版本中可能无法使用。只有'void main(void)'保证将来能够工作。 – Lundin