在DOS下,printf()函数可执行代码是静态链接嵌入到exe文件中的,但在Windows下,由于不再允许程序直接操作硬件,读写真实设备或虚拟设备的输入输出函数,都强制应用程序调用操作系统提供的接口(即DOS时代下的系统中断服务,TC和MSC均允许绕开DOS中断直接操作显示内存,故TC的cprintf()函数是直接写屏的,速度超快),这部分程序是操作系统提供的,原则上不需、也不应该嵌入到应用程序中(正如DOS时代的系统中断程序是在BIOS或DOS中的一样),这些函数的具体可执行代码,都放在编译环境与系统相关的DLL文件中,必须与应用程序一并发放。
在逻辑上,编译器可以不使用DLL,把printf()的可执行代码嵌入到应用程序中,但它绕不过自己的实际上司操作系统,当这些要求向设备进行输入输出动作的指令发出,系统就会接收控制权,把真实操作拦截到自己的输入输出DLL中,废掉你自己的那些东西,如果你或编译器不按规矩来,比如不遵守调用API的协议、直接向显示内存写内容等等,这样乱写printf()实现代码,就会收到黄牌警告或红牌罚出场。
尽管我已经无数次说过,但这里仍然不妨再重申一次:C语言没有定义任何输入输出功能。所有输入输出函数,包括printf(),都不是C语言固有的东西。不管哪个编译器,它提供的printf()函数代码库,除了行为表现应与C标准规定的相符外,具体如何实现的细节取决于它与操作系统的了解和结合程度,同一个编译器在不同的操作系统平台下,其printf()函数的实现代码是不一样的(甚至拥有各不相同的标准之外的扩展功能),C/C++程序的可移植性,最多在源代码上可移植,但移植的时候必须要重新编译,不存在拿着在Windows下编译出来的exe文件到Linux下可直接执行这样的可移植性(基于虚拟机.NET C++程序才可以这样),原因就是如上所述。
对硬件为所欲为的时代已经一去不复返了!
[
本帖最后由 TonyDeng 于 2013-3-9 18:42 编辑 ]