没有包含stdio.h头文件,程序是怎样找到库函数getchar()的?

时间:2021-01-01 01:52:17
//#include <stdio.h>
#define EOF -1
int main()
{
        int c;
        while((c = getchar()) != EOF)
                putchar(c);
}
我没有包含stdio.h这个头文件,但是程序可以执行
为什么程序可以找的到库函数getchar()和putchar()呢?
按照什么路线来找的?

12 个解决方案

#1


头文件只是个函数原型声明。你要调用的在链接库里。

#2


转:
包含头文件的目的是让编译器在做编译这个步骤的时候,知道函数的原型,然后可以做一些检查。 
这是个好习惯。 
C语言对此要求比较宽松。如果编译器没找到被函数的原型,通常会假设程序员没有犯错误;也就是说,不管调用的时候怎么写的,编译器都会假定这就是函数原型。这种处理方法很容易引起一些问题,大多数情况会在链接的时候被发现。 
C++就很严格了,如果找不到函数原型直接就报错。

#3


除非你编译器缺省帮你包含,否则编译都过不了

#4


是的,这是默认函数原型,我忘记这个了,C语言比较恶劣的一个特性:)

引用 2 楼 lingyin55 的回复:
转: 
包含头文件的目的是让编译器在做编译这个步骤的时候,知道函数的原型,然后可以做一些检查。 
这是个好习惯。 
C语言对此要求比较宽松。如果编译器没找到被函数的原型,通常会假设程序员没有犯错误;也就是说,不管调用的时候怎么写的,编译器都会假定这就是函数原型。这种处理方法很容易引起一些问题,大多数情况会在链接的时候被发现。 
C++就很严格了,如果找不到函数原型直接就报错。

#5


编译器会自动给你加上一大堆东西,其中包括一些常用的函数头文件。


如果你用gcc,就可以用gcc -E a.c -o a.i

vim a.i

这个就是编译之前,宏替换的结果文件。宏处理这个过程添加了很多东西。

#6


引用 2 楼 lingyin55 的回复:
转:
包含头文件的目的是让编译器在做编译这个步骤的时候,知道函数的原型,然后可以做一些检查。
这是个好习惯。
C语言对此要求比较宽松。如果编译器没找到被函数的原型,通常会假设程序员没有犯错误;也就是说,不管调用的时候怎么写的,编译器都会假定这就是函数原型。这种处理方法很容易引起一些问题,大多数情况会在链接的时候被发现。
C++就很严格了,如果找不到函数原型直接就报错。

哦 
也就是说 头文件只是一个声明而已
而具体函数的实现是在连接的时候去找编译器的默认的库,如果默认的库里面找的到的话 就可以去执行。
但是 
int main()
{
    printf("aaaa\n");
}
就编译通过不了的 是找不到printf的库?

#7


引用 5 楼 wuyu637 的回复:
编译器会自动给你加上一大堆东西,其中包括一些常用的函数头文件。


如果你用gcc,就可以用gcc -E a.c -o a.i

vim a.i

这个就是编译之前,宏替换的结果文件。宏处理这个过程添加了很多东西。

哦 我是用gcc的
我去看看哈 谢谢

#8


授人以鱼 不如授人以渔
请问楼上的各位高手
这些知识是从哪儿才能获得呢?
请不吝赐教 
我可以给帖子追加分哈~

#9


这要看编译器,能够找到是因为编译器假设了这样原型的存在,但大多数时候是不会有这种好处的,所以好的做法是不关编译器能不能帮你找到声明,你都要include进去。

引用 6 楼 eclipse_2 的回复:
引用 2 楼 lingyin55 的回复:
转: 
包含头文件的目的是让编译器在做编译这个步骤的时候,知道函数的原型,然后可以做一些检查。 
这是个好习惯。 
C语言对此要求比较宽松。如果编译器没找到被函数的原型,通常会假设程序员没有犯错误;也就是说,不管调用的时候怎么写的,编译器都会假定这就是函数原型。这种处理方法很容易引起一些问题,大多数情况会在链接的时候被发现。 
C++就很严格了,如果找不到函数原型直接就报错。…

#10


呵呵,多思考,多动手,多问。问是怎么学习的时候总是这几句老话,但是要时时刻刻做到却不容易啊。

引用 8 楼 eclipse_2 的回复:
授人以鱼 不如授人以渔 
请问楼上的各位高手 
这些知识是从哪儿才能获得呢? 
请不吝赐教 
我可以给帖子追加分哈~ 

#11


引用 10 楼 lingyin55 的回复:
呵呵,多思考,多动手,多问。问是怎么学习的时候总是这几句老话,但是要时时刻刻做到却不容易啊。

引用 8 楼 eclipse_2 的回复:
授人以鱼 不如授人以渔
请问楼上的各位高手
这些知识是从哪儿才能获得呢?
请不吝赐教
我可以给帖子追加分哈~

有道理啊~

#12


stdio这个头文件经常用,编译器自己自动包了。

#1


头文件只是个函数原型声明。你要调用的在链接库里。

#2


转:
包含头文件的目的是让编译器在做编译这个步骤的时候,知道函数的原型,然后可以做一些检查。 
这是个好习惯。 
C语言对此要求比较宽松。如果编译器没找到被函数的原型,通常会假设程序员没有犯错误;也就是说,不管调用的时候怎么写的,编译器都会假定这就是函数原型。这种处理方法很容易引起一些问题,大多数情况会在链接的时候被发现。 
C++就很严格了,如果找不到函数原型直接就报错。

#3


除非你编译器缺省帮你包含,否则编译都过不了

#4


是的,这是默认函数原型,我忘记这个了,C语言比较恶劣的一个特性:)

引用 2 楼 lingyin55 的回复:
转: 
包含头文件的目的是让编译器在做编译这个步骤的时候,知道函数的原型,然后可以做一些检查。 
这是个好习惯。 
C语言对此要求比较宽松。如果编译器没找到被函数的原型,通常会假设程序员没有犯错误;也就是说,不管调用的时候怎么写的,编译器都会假定这就是函数原型。这种处理方法很容易引起一些问题,大多数情况会在链接的时候被发现。 
C++就很严格了,如果找不到函数原型直接就报错。

#5


编译器会自动给你加上一大堆东西,其中包括一些常用的函数头文件。


如果你用gcc,就可以用gcc -E a.c -o a.i

vim a.i

这个就是编译之前,宏替换的结果文件。宏处理这个过程添加了很多东西。

#6


引用 2 楼 lingyin55 的回复:
转:
包含头文件的目的是让编译器在做编译这个步骤的时候,知道函数的原型,然后可以做一些检查。
这是个好习惯。
C语言对此要求比较宽松。如果编译器没找到被函数的原型,通常会假设程序员没有犯错误;也就是说,不管调用的时候怎么写的,编译器都会假定这就是函数原型。这种处理方法很容易引起一些问题,大多数情况会在链接的时候被发现。
C++就很严格了,如果找不到函数原型直接就报错。

哦 
也就是说 头文件只是一个声明而已
而具体函数的实现是在连接的时候去找编译器的默认的库,如果默认的库里面找的到的话 就可以去执行。
但是 
int main()
{
    printf("aaaa\n");
}
就编译通过不了的 是找不到printf的库?

#7


引用 5 楼 wuyu637 的回复:
编译器会自动给你加上一大堆东西,其中包括一些常用的函数头文件。


如果你用gcc,就可以用gcc -E a.c -o a.i

vim a.i

这个就是编译之前,宏替换的结果文件。宏处理这个过程添加了很多东西。

哦 我是用gcc的
我去看看哈 谢谢

#8


授人以鱼 不如授人以渔
请问楼上的各位高手
这些知识是从哪儿才能获得呢?
请不吝赐教 
我可以给帖子追加分哈~

#9


这要看编译器,能够找到是因为编译器假设了这样原型的存在,但大多数时候是不会有这种好处的,所以好的做法是不关编译器能不能帮你找到声明,你都要include进去。

引用 6 楼 eclipse_2 的回复:
引用 2 楼 lingyin55 的回复:
转: 
包含头文件的目的是让编译器在做编译这个步骤的时候,知道函数的原型,然后可以做一些检查。 
这是个好习惯。 
C语言对此要求比较宽松。如果编译器没找到被函数的原型,通常会假设程序员没有犯错误;也就是说,不管调用的时候怎么写的,编译器都会假定这就是函数原型。这种处理方法很容易引起一些问题,大多数情况会在链接的时候被发现。 
C++就很严格了,如果找不到函数原型直接就报错。…

#10


呵呵,多思考,多动手,多问。问是怎么学习的时候总是这几句老话,但是要时时刻刻做到却不容易啊。

引用 8 楼 eclipse_2 的回复:
授人以鱼 不如授人以渔 
请问楼上的各位高手 
这些知识是从哪儿才能获得呢? 
请不吝赐教 
我可以给帖子追加分哈~ 

#11


引用 10 楼 lingyin55 的回复:
呵呵,多思考,多动手,多问。问是怎么学习的时候总是这几句老话,但是要时时刻刻做到却不容易啊。

引用 8 楼 eclipse_2 的回复:
授人以鱼 不如授人以渔
请问楼上的各位高手
这些知识是从哪儿才能获得呢?
请不吝赐教
我可以给帖子追加分哈~

有道理啊~

#12


stdio这个头文件经常用,编译器自己自动包了。