好久没有看C的书籍了,前两天在CSDN求助,求各位大神们能介绍一本书,我求助的要求是这样的:求一本介绍Windows C语言运行时库的书籍。
书的内容要求是:能够具体介绍C语言库函数的实现方法,例如printf这样的函数,或者fopen这样的函数是如何实现的。结果很多大侠没有明白我的意思,
给我介绍的都是非常经典的书籍: 《Windows程序设计》、《Windows核心编程》这样的书籍,在此对那些回复的大侠表示感谢。 不知道园子里的大侠
有没有人知道这方面的书籍,有的话请不吝指教,在此先谢过了。
我前些天偶然看到了部分Windows下的C语言库函数的源代码,先贴出来一段printf的代码给大家看看,源代码的所有权归Microsoft所有,在此我仅仅是
为了贴出来供大家鉴赏,看看原来printf函数可以有多简单。
/***
*printf.c - print formatted
*
* Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
*
*Purpose:
* defines printf() - print formatted data
*
*******************************************************************************/
#include <cruntime.h>
#include <stdio.h>
#include <dbgint.h>
#include <stdarg.h>
#include <file2.h>
#include <internal.h>
#include <mtdll.h>
/***
*int printf(format, ...) - print formatted data
*
*Purpose:
* Prints formatted data on stdout using the format string to
* format data and getting as many arguments as called for
* Uses temporary buffering to improve efficiency.
* _output does the real work here
*
*Entry:
* char *format - format string to control data format/number of arguments
* followed by list of arguments, number and type controlled by
* format string
*
*Exit:
* returns number of characters printed
*
*Exceptions:
*
*******************************************************************************/
int __cdecl printf (
const char *format,
...
)
/*
* stdout 'PRINT', 'F'ormatted
*/
{
va_list arglist;
int buffing;
int retval;
va_start(arglist, format);
_ASSERTE(format != NULL);
_lock_str2(1, stdout);
buffing = _stbuf(stdout);
retval = _output(stdout,format,arglist);
_ftbuf(buffing, stdout);
_unlock_str2(1, stdout);
return(retval);
}
我第一次看Windows下微软的代码,不得不对微软的人说声:原来大神的人物就是这样的。首先这段代码非常精简,其次风格非常好,与我接下来
要分析的一段代码简直就是天壤之别。我曾经在一段时间受Linux阵营的人的影响,一直觉得微软的Windows不好,甚至一度将windows从自己的计
算机上卸载,后来因为各种原因又回来了(主要是Step 7/RSLogix等工控软件不支持Linux,现在我发现自己以前的看法绝对有失偏颇,现在想想其实
微软对整个计算机的推动作用还是非常大的,好了这里不多说了。下面来看看今天的代码:
int i;main(){for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\
o, world!\n",'/'/'/'));}read(j,i,p){write(j/p+p,i---j,i/i);}
这段代码的作用是输出: hello, world!
分析代码还是按照原来的套路进行,第一步进行缩排,得到如下代码:
int i;
main()
{
for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\o, world!\n",'/'/'/'))
;
}
read(j,i,p)
{
write(j/p+p,i---j,i/i);
}
接下来补全部分代码定义,很显然上面的代码是按照K&R规范编制的,很多语法在ANSI C标准里面是不成立的。
#include <stdio.h>
int i;
int main(int argc,char **argv)
{
for(;i["]<i;++i){--i;}"];read('-'-'-',i+++"hell\o, world!\n",'/'/'/'))
;
return 0;
}
int read(int j, int i, int p)
{
write(j/p+p,i---j,i/i);
}
补全代码后这段代码需要说明的几个问题是:
1、 i[str] 在解析的时候 ==> str[i] ; 其中 str是一个字符串字面值。
2、 字符串字面值实际返回的是一个指针, 即 “str” 的返回值类型是 char *
3、 '-'-'-' 这个表达式实际上==> ( '-' ) - ('-') ; 即表达是的返回值为 0 。
4、 '/'/'/' 这个表达式实际上==> ( '/' ) / ( '/' ) ; 即表达式的返回值是 1 。
5、 最后一个需要说明的是write函数, 这个函数的用法我也不知道,但是可以google或者百度之,这里摘录一下百度百科的解释:
int write(int handel, void *buf, int nbyte);
handel 是文件描述符;
buf是你指定的缓冲区,即指针,指向一段内存单元;
nbyte是你要写入文件指定的字节数;
返回值:写入文档的字节数(成功);-1(出错)
这里就涉及到 stdout 的定义,这个宏定义的值是多大估计不需要再说了。还有就是按照unix处理设备的方式:一切皆文件。(没有人定义过,我自己的理解)。
就和面向对象一样:一切皆对象。
6、 这里还有一个需要说明的问题:
i+++"hell\o, world!\n"
和
i---j;
这个地方的解析牵扯到C语言编译解析过程的贪心法,具体的内容有兴趣的可以看看编译原理相关的书,我是不懂的,园子里脑袋大侠的文章写得不错,对编译
器有深入的讨论,因此 +++ 和 ---在解析的时候会解释成(操作数++)+ 和 (操作数——)- 。
对于第6个问题,在chinaunix论坛里面 pmerofc 大侠说这样的表达式不正确,我一直不明白,也不好意思请教, 原文的链接我忘记了,是一个女生自己写的博文,
然后说这样有点问题,链接我也忘记了。不知道园子里的大侠能否解释一二。
心里有点烦,非常的烦,写了这么多,为一些事情而烦恼......................
曾经有人大代表说不支持农村孩子上大学,很多人反对,其实有些事情,还要辩证的看,我自己觉得就还是有点道理的(为了不被误会,说明一点我自己就是农村的)
从我自己的经历来看,还是值得思考的问题。
这里问个比较私人的问题: 不知道园子里garbageman大侠是否就是 chinaunix里面的pmerofc大侠,因为我搜索pmerofc大侠,看到他有文章链接是《C解毒》。
如果是的话,请garbageMan大侠回复一句,在此先表示感谢。
算了不说了, 准备睡觉........