好久沒有看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大俠回複一句,在此先表示感謝。
算了不說了, 準備睡覺........