为什么排除标准库后没有报错?

Why there is no error after excluding standard library?

作为 C 的初学者,我正在尝试一些东西,所以我排除了标准库 <stdio.h> 并且仍然没有错误。有人可以解释一下吗?

示例代码如下:

main()
{
    printf("hello, world!\n");
}

此程序在有或没有库的情况下都可以正常工作。为什么?

虽然建议在适当的时候包含标准头文件,但这不是必需的。函数的默认 return 值是 int (您在代码中忽略它并且是完全允许的)。函数原型的概念是在存在大量现有程序之后很好地添加到语言中的,因此为了不破坏它们,函数原型是可选的,默认情况下没有原型,这意味着没有编译器验证参数类型正确。

您的程序能够 link 正确地针对标准库并正确执行。

"Hello World!" 是一个非常简单的程序,因此依赖此行为来做任何实质性的事情都是错误的。

TL;DR -- 您排除了头文件,而不是标准库。


如果排除函数具有前向声明的头文件,您将收到一条警告,肯定会提到函数的 "implicit declaration"。

在那种情况下(根据最新标准无效),函数将被假定为 return int 并且不会检查传递的参数数量。

但是,默认情况下,从您的源代码生成的目标文件链接到默认的 C 库 libc,该库具有函数定义。在这种情况下,函数 return 类型匹配 implicit 情况,因此链接器很乐意将目标文件链接在一起。

因此,它成功完成了链接并且工作相同

也就是说,main()应该是int main(void),至少要符合标准。