scanf和printf既然是标准输入输出函数,为什么可以没有预处理头文件#include<stdio.h>,仅靠编译器识别吗?

如题所述

不能,在生产级别的开发环境中都得包含<stdio.h>,不要说用TC或者VC6了,完全误人子弟。

给你说一下库、头文件、源文件、编译器之间的交互过程。源文件中包含头文件<stdio.h>所引入的scanf和printf仅仅是一个声明,这个声明在源文件内被编译器先和其他的代码编译,构造语法树生成.obj,这个是中间的文件,不包含scanf的实现代码。稍后在链接阶段,会把这些.obj制作为二进制的可执行文件(EXE DLL ELF DSO),那个对scanf的引用会被替换为汇编级别的函数调用,即PUSH/CALL scanf/POP这样。库就是编译器生成好的二进制文件(库有静态库和动态库之分,静态库.LIB不能自己执行,也不能被其他程序调用,而动态库.DLL可以被别的EXE DLL调用),这个文件中的代码可以被别的程序所引用,比如scanf printf的实现代码,或者是你自己编写的算法。编译器只是个字符串处理工具,处理负责语法规范的源文件,生成二进制可执行数据,至于scanf这些C函数依赖于底层的实现,和编译器可以说几乎无关。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-09-25
肯定在哪里有#include <stdio.h>的,只是你没看到而已,比如用VS写的程序
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
int i;
scanf("%d",&i);
printf("Number=%d.\n",i);
return 0;
}
这是正确的,因为stdafx.h里面有#include <stdio.h>
第2个回答  2012-09-25
严格的来说都得要包含,但是有一个编译器确实例外,那就是TC2.0,这么经典的开发工具,我想不管你使用什么高端的编译器,TC2.0永远都是那么经典,体积有那么小,想想现在的集成环境动不动几个G,真是很怕人。
第3个回答  2012-09-27
需要包含这个哦, 有的是因为包含了其他头文件, 而那个文件中包含了<stdio.h>
第4个回答  2012-09-26
嗯是啊