#define EOF -1
int main()
{
int c;
while((c = getchar()) != EOF)
putchar(c);
}
我没有包含stdio.h这个头文件,但是程序可以执行
为什么程序可以找的到库函数getchar()和putchar()呢?
按照什么路线来找的?
12 个解决方案
#1
头文件只是个函数原型声明。你要调用的在链接库里。
#2
转:
包含头文件的目的是让编译器在做编译这个步骤的时候,知道函数的原型,然后可以做一些检查。
这是个好习惯。
C语言对此要求比较宽松。如果编译器没找到被函数的原型,通常会假设程序员没有犯错误;也就是说,不管调用的时候怎么写的,编译器都会假定这就是函数原型。这种处理方法很容易引起一些问题,大多数情况会在链接的时候被发现。
C++就很严格了,如果找不到函数原型直接就报错。
包含头文件的目的是让编译器在做编译这个步骤的时候,知道函数的原型,然后可以做一些检查。
这是个好习惯。
C语言对此要求比较宽松。如果编译器没找到被函数的原型,通常会假设程序员没有犯错误;也就是说,不管调用的时候怎么写的,编译器都会假定这就是函数原型。这种处理方法很容易引起一些问题,大多数情况会在链接的时候被发现。
C++就很严格了,如果找不到函数原型直接就报错。
#3
除非你编译器缺省帮你包含,否则编译都过不了
#4
是的,这是默认函数原型,我忘记这个了,C语言比较恶劣的一个特性:)
#5
编译器会自动给你加上一大堆东西,其中包括一些常用的函数头文件。
如果你用gcc,就可以用gcc -E a.c -o a.i
vim a.i
这个就是编译之前,宏替换的结果文件。宏处理这个过程添加了很多东西。
如果你用gcc,就可以用gcc -E a.c -o a.i
vim a.i
这个就是编译之前,宏替换的结果文件。宏处理这个过程添加了很多东西。
#6
哦
也就是说 头文件只是一个声明而已
而具体函数的实现是在连接的时候去找编译器的默认的库,如果默认的库里面找的到的话 就可以去执行。
但是
int main()
{
printf("aaaa\n");
}
就编译通过不了的 是找不到printf的库?
#7
哦 我是用gcc的
我去看看哈 谢谢
#8
授人以鱼 不如授人以渔
请问楼上的各位高手
这些知识是从哪儿才能获得呢?
请不吝赐教
我可以给帖子追加分哈~
请问楼上的各位高手
这些知识是从哪儿才能获得呢?
请不吝赐教
我可以给帖子追加分哈~
#9
这要看编译器,能够找到是因为编译器假设了这样原型的存在,但大多数时候是不会有这种好处的,所以好的做法是不关编译器能不能帮你找到声明,你都要include进去。
#10
呵呵,多思考,多动手,多问。问是怎么学习的时候总是这几句老话,但是要时时刻刻做到却不容易啊。
#11
有道理啊~
#12
stdio这个头文件经常用,编译器自己自动包了。
#1
头文件只是个函数原型声明。你要调用的在链接库里。
#2
转:
包含头文件的目的是让编译器在做编译这个步骤的时候,知道函数的原型,然后可以做一些检查。
这是个好习惯。
C语言对此要求比较宽松。如果编译器没找到被函数的原型,通常会假设程序员没有犯错误;也就是说,不管调用的时候怎么写的,编译器都会假定这就是函数原型。这种处理方法很容易引起一些问题,大多数情况会在链接的时候被发现。
C++就很严格了,如果找不到函数原型直接就报错。
包含头文件的目的是让编译器在做编译这个步骤的时候,知道函数的原型,然后可以做一些检查。
这是个好习惯。
C语言对此要求比较宽松。如果编译器没找到被函数的原型,通常会假设程序员没有犯错误;也就是说,不管调用的时候怎么写的,编译器都会假定这就是函数原型。这种处理方法很容易引起一些问题,大多数情况会在链接的时候被发现。
C++就很严格了,如果找不到函数原型直接就报错。
#3
除非你编译器缺省帮你包含,否则编译都过不了
#4
是的,这是默认函数原型,我忘记这个了,C语言比较恶劣的一个特性:)
#5
编译器会自动给你加上一大堆东西,其中包括一些常用的函数头文件。
如果你用gcc,就可以用gcc -E a.c -o a.i
vim a.i
这个就是编译之前,宏替换的结果文件。宏处理这个过程添加了很多东西。
如果你用gcc,就可以用gcc -E a.c -o a.i
vim a.i
这个就是编译之前,宏替换的结果文件。宏处理这个过程添加了很多东西。
#6
哦
也就是说 头文件只是一个声明而已
而具体函数的实现是在连接的时候去找编译器的默认的库,如果默认的库里面找的到的话 就可以去执行。
但是
int main()
{
printf("aaaa\n");
}
就编译通过不了的 是找不到printf的库?
#7
哦 我是用gcc的
我去看看哈 谢谢
#8
授人以鱼 不如授人以渔
请问楼上的各位高手
这些知识是从哪儿才能获得呢?
请不吝赐教
我可以给帖子追加分哈~
请问楼上的各位高手
这些知识是从哪儿才能获得呢?
请不吝赐教
我可以给帖子追加分哈~
#9
这要看编译器,能够找到是因为编译器假设了这样原型的存在,但大多数时候是不会有这种好处的,所以好的做法是不关编译器能不能帮你找到声明,你都要include进去。
#10
呵呵,多思考,多动手,多问。问是怎么学习的时候总是这几句老话,但是要时时刻刻做到却不容易啊。
#11
有道理啊~
#12
stdio这个头文件经常用,编译器自己自动包了。