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

小魔菇 2009-03-05 04:01:42
//#include <stdio.h>
#define EOF -1
int main()
{
int c;
while((c = getchar()) != EOF)
putchar(c);
}
我没有包含stdio.h这个头文件,但是程序可以执行
为什么程序可以找的到库函数getchar()和putchar()呢?
按照什么路线来找的?
...全文
749 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2009-03-05
  • 打赏
  • 举报
回复
stdio这个头文件经常用,编译器自己自动包了。
小魔菇 2009-03-05
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lingyin55 的回复:]
呵呵,多思考,多动手,多问。问是怎么学习的时候总是这几句老话,但是要时时刻刻做到却不容易啊。

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

[/Quote]
有道理啊~
lingyin55 2009-03-05
  • 打赏
  • 举报
回复
呵呵,多思考,多动手,多问。问是怎么学习的时候总是这几句老话,但是要时时刻刻做到却不容易啊。

[Quote=引用 8 楼 eclipse_2 的回复:]
授人以鱼 不如授人以渔
请问楼上的各位高手
这些知识是从哪儿才能获得呢?
请不吝赐教
我可以给帖子追加分哈~
[/Quote]
lingyin55 2009-03-05
  • 打赏
  • 举报
回复
这要看编译器,能够找到是因为编译器假设了这样原型的存在,但大多数时候是不会有这种好处的,所以好的做法是不关编译器能不能帮你找到声明,你都要include进去。

[Quote=引用 6 楼 eclipse_2 的回复:]
引用 2 楼 lingyin55 的回复:
转:
包含头文件的目的是让编译器在做编译这个步骤的时候,知道函数的原型,然后可以做一些检查。
这是个好习惯。
C语言对此要求比较宽松。如果编译器没找到被函数的原型,通常会假设程序员没有犯错误;也就是说,不管调用的时候怎么写的,编译器都会假定这就是函数原型。这种处理方法很容易引起一些问题,大多数情况会在链接的时候被发现。
C++就很严格了,如果找不到函数原型直接就报错。…
[/Quote]
小魔菇 2009-03-05
  • 打赏
  • 举报
回复
授人以鱼 不如授人以渔
请问楼上的各位高手
这些知识是从哪儿才能获得呢?
请不吝赐教
我可以给帖子追加分哈~
小魔菇 2009-03-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wuyu637 的回复:]
编译器会自动给你加上一大堆东西,其中包括一些常用的函数头文件。


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

vim a.i

这个就是编译之前,宏替换的结果文件。宏处理这个过程添加了很多东西。
[/Quote]
哦 我是用gcc的
我去看看哈 谢谢
小魔菇 2009-03-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 lingyin55 的回复:]
转:
包含头文件的目的是让编译器在做编译这个步骤的时候,知道函数的原型,然后可以做一些检查。
这是个好习惯。
C语言对此要求比较宽松。如果编译器没找到被函数的原型,通常会假设程序员没有犯错误;也就是说,不管调用的时候怎么写的,编译器都会假定这就是函数原型。这种处理方法很容易引起一些问题,大多数情况会在链接的时候被发现。
C++就很严格了,如果找不到函数原型直接就报错。
[/Quote]

也就是说 头文件只是一个声明而已
而具体函数的实现是在连接的时候去找编译器的默认的库,如果默认的库里面找的到的话 就可以去执行。
但是
int main()
{
printf("aaaa\n");
}
就编译通过不了的 是找不到printf的库?
wuyu637 2009-03-05
  • 打赏
  • 举报
回复
编译器会自动给你加上一大堆东西,其中包括一些常用的函数头文件。


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

vim a.i

这个就是编译之前,宏替换的结果文件。宏处理这个过程添加了很多东西。
arong1234 2009-03-05
  • 打赏
  • 举报
回复
是的,这是默认函数原型,我忘记这个了,C语言比较恶劣的一个特性:)

[Quote=引用 2 楼 lingyin55 的回复:]
转:
包含头文件的目的是让编译器在做编译这个步骤的时候,知道函数的原型,然后可以做一些检查。
这是个好习惯。
C语言对此要求比较宽松。如果编译器没找到被函数的原型,通常会假设程序员没有犯错误;也就是说,不管调用的时候怎么写的,编译器都会假定这就是函数原型。这种处理方法很容易引起一些问题,大多数情况会在链接的时候被发现。
C++就很严格了,如果找不到函数原型直接就报错。
[/Quote]
arong1234 2009-03-05
  • 打赏
  • 举报
回复
除非你编译器缺省帮你包含,否则编译都过不了
lingyin55 2009-03-05
  • 打赏
  • 举报
回复
转:
包含头文件的目的是让编译器在做编译这个步骤的时候,知道函数的原型,然后可以做一些检查。
这是个好习惯。
C语言对此要求比较宽松。如果编译器没找到被函数的原型,通常会假设程序员没有犯错误;也就是说,不管调用的时候怎么写的,编译器都会假定这就是函数原型。这种处理方法很容易引起一些问题,大多数情况会在链接的时候被发现。
C++就很严格了,如果找不到函数原型直接就报错。
iambic 2009-03-05
  • 打赏
  • 举报
回复
头文件只是个函数原型声明。你要调用的在链接库里。

70,019

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧