volcanol的工控博客
Email : lilinly225@126.com 索要资料加QQ 点击进入 或 点击左侧的资料分享专用帖

volcanol ---- View OF Linux Can Appreciate Nature OF Linux

天行健,君子以自强不息

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

      好久没有看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大侠回复一句,在此先表示感谢。

    算了不说了, 准备睡觉........

 



posted on 2011-10-17 21:35  volcanol  阅读(1771)  评论(7编辑  收藏  举报
volcanol ----View OF Linux Can Appreciate Nature OF Linux。