Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
void main(){}在没有头文件的情况下工作正常。这是怎么发生的,主函数的定义在哪里用C写的?_C_Header Files_Main - Fatal编程技术网

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

void main(){}在没有头文件的情况下工作正常。这是怎么发生的,主函数的定义在哪里用C写的?,c,header-files,main,C,Header Files,Main,我编写了以下代码: void main() { } 没有任何头文件它如何运行?如果在没有头的代码中使用printf,编译器不知道引用的实体类型 如果您提供了一个main的实现,那么编译器完全知道这意味着什么,而您只是指定了它。void是一个内置类型,由编译器知道main是程序的入口点,而正如您所写的那样,printf需要一些原型。如果您在源代码中编写自己的printf定义,它将在编译时不带头 编译C程序只需指定一个入口点,即main 标题仅提供其他IO可能性 void printf() {

我编写了以下代码:

void main() {

}

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

如果在没有头的代码中使用
printf
,编译器不知道引用的实体类型


如果您提供了一个
main
的实现,那么编译器完全知道这意味着什么,而您只是指定了它。

void
是一个内置类型,由编译器知道
main
是程序的入口点,而正如您所写的那样,
printf
需要一些原型。如果您在源代码中编写自己的
printf
定义,它将在编译时不带头

编译C程序只需指定一个入口点,即
main

标题仅提供其他IO可能性

void printf()
{

}

int main()
{
    printf();
}
来自C标准(5.1.2.2.1程序启动)

1程序启动时调用的函数名为main。T他 实现没有声明此功能的原型。应该是 使用int的返回类型定义且不带参数:

或者使用两个参数(此处称为argc和argv,尽管有 可以使用名称,因为它们是其所在函数的本地名称 声明):

或同等品;10) 或者以其他实现定义的方式

尽管一些编译器(例如MS VS的编译器)支持返回类型为
void
的函数main声明,但这种声明不是函数main的C标准声明

因此,由于实现没有声明函数main的原型,并且如果函数main不调用任何其他函数,则不需要任何头

你可以直接写信

int main( void )
{
}
return语句也可以省略


请注意,定义函数main的是用户。因此,在上面介绍的程序中,有一个函数main的定义,它的主体中不包含任何语句。函数不执行任何操作,并立即将控件返回到宿主环境。

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

在C程序中唯一必须做的事情就是在程序中有某种形式的入口点。在托管系统(如带有操作系统的PC)上,此入口点必须是名为
main()
的函数。它可以用几种方式声明<代码>void main()不保证工作,除非编译器明确支持该表单。最可移植和标准化的格式是:

int main (void)
{
  return 0;
}
当然,这个程序运行起来并不令人兴奋,因为它完全不起作用。但这是完全正确的

main()不需要任何前向声明。对于独立环境,入口点的格式完全由实现定义。对于托管环境,C标准明确表示“实现没有声明此函数的原型。”—在本例中,实现意味着编译器。在英语中,这意味着根据语言定义,
main()
函数必须在没有任何先前声明的情况下工作


.

你必须编写
main()
的定义,然后就这么做了。printf也是。但是我们必须这样做,main()@FilipKočicat呢?运行C程序唯一需要的是
main
函数,如果不包括IO之类的头,它就做不了什么,但是你不需要@BilltheLizard的可能副本,他没有问main是否必须在header中,他问如何可以在没有任何header的情况下运行程序。并且用
void
声明
main
具有未定义/实现定义的行为,因此它根本不需要工作。重新定义
printf
也有未定义的行为。Ofc我知道,它只是解释了这些程序编译的工作原理,你不能让初学者纠结于实现定义/未定义的行为等。无论如何,感谢你的否决:-)。你怎么会认为这是一个托管环境?请看:@Lundin如果它不是托管环境,那么问题的作者提到了这一点。我的观点是,它引用了关于托管环境的子章节,忽略了main()的其他形式是完全正确的。因此,引号不能证明main()的格式,但只显示了托管系统的一些常见格式。隐含的假设非常重要的是,任何不知道独立和托管环境之间的差异的人都会使用后者。一边涉猎C编程。或者对于那些平庸的PC程序员来说,他们最终以编写嵌入式系统程序而告终。他们对标准中的内容一无所知,只是偶然地加入了某种形式的main()。甚至有嵌入式系统工具供应商也犯了这个错误-许多使用gcc的IDE:s无法将
-ffreestanding
设置为默认选项,因此迫使其用户使用无意义的main(),从而导致系统资源浪费。还请注意
void main()
是一种过时的格式,在该语言的未来版本中可能无法使用。只有
void main(void)
保证在将来工作。
int main( void )
{
}
int main (void)
{
  return 0;
}