DEBUG宏

4.8.6.運算中的臨時匿名變量
4.8.6.一、C語言和彙編的區別(彙編徹底對應機器操做,C對應邏輯操做)
(1)C語言叫高級語言,彙編語言叫低級語言。
(2)低級語言的意思是彙編語言和機器操做相對應,彙編語言只是CPU的機器碼的助記符,用匯編語言寫程序必須擁有機器的思惟。由於不一樣的CPU設計時指令集差別很大,所以用匯編編程的差別很大。
(3)高級語言(C語言)它對低級語言進行了封裝(C語言的編譯器來完成),給程序員提供了一個靠近人類思惟的一些語法特徵,人類不用過於考慮機器原理,而能夠按照本身的邏輯原理來編程。譬如數組、結構體、指針····
(4)更高級的語言如java、C#等只是進一步強化了C語言提供的人性化的操做界面語法,在易用性上、安全性上進行了提高。java

4.8.6.二、C語言的一些「小動做」
(1)高級語言中有一些元素是機器中沒有的
(2)高級語言在運算中容許咱們大跨度的運算。意思就是低級語言中須要好幾步才能完成的一個運算,在高級語言中只要一步便可完成。譬如C語言中一個變量i要加1,在C中只須要i++便可,看起來只有一句代碼。但實際上翻譯到彙編階段須要3步才能完成:第1步從內存中讀取i到寄存器,第2步對寄存器中的i進行加1,第3步將加1後的i寫回內存中的i。程序員

4.8.6.三、使用臨時變量來理解強制類型轉換編程

4.8.6.四、使用臨時變量來理解不一樣數據類型之間的運算數組


4.8.7.順序結構
4.8.7.一、最淺顯的順序結構:三種結構之一
(1)代碼執行的時候若是沒有遇到判斷跳轉或者循環,默認是順序執行的。執行完上一句則開始執行下一句。
(2)順序結構說明CPU的工做狀態,就是以時間軸來順序執行全部的代碼語句直到停機。安全

4.8.7.二、選擇和循環結構內部的順序結構
(1)譬如if(){}在{}內部是if的代碼段,在代碼段內部仍是按照順序結構來執行的。
(2)switch case內部也同樣,也是按照順序結構執行的。
(3)while for內部也是按照順序結構來執行的。函數

4.8.7.三、編譯過程當中的順序結構
(1)一個C程序有多個.c文件組成,編譯的時候多個.c文件是獨立分開編譯的。每一個c文件編譯的時候,編譯器是按照從前到後的順序逐行進行編譯的。
(2)編譯器編程時的順序編譯會致使函數/變量必須先定義/聲明才能調用,這也是C語言中函數/變量聲明的來源。
(3)連接過程當中呢?應該說連接過程連接器其實是在連接腳本指導下完成的。因此連接時的.o文件的順序是由連接腳本指定的。若是連接腳本中明確指定了順序則會優先考慮這個規則按照這個指定的順序排布,若是連接腳本中沒有指定具體的順序則連接器會自動的排布。翻譯

4.8.7.四、思考:爲何本質都是順序結構?
(1)順序結構本質上符號CPU的設計原理,CPU又是人設計的,因此CPU的設計符合人的思考原理debug

debug宏的實現原理設計

(1)DEBUG宏大概的原理是:
#ifdef DEBUG
#define dbg() printf()
#else
#define dbg()
#endif
(2)工做方式是:若是咱們要輸出DEBUG版本則在條件編譯語句前加上#define DEBUG便可,這樣程序中的調試語句dbg()就會被替換成printf從而輸出;若是咱們要輸出RELEASE版本則去掉#define DEBUG,則dbg()就會被替換成空,則程序中全部的dbg()語句直接蒸發了,這樣的程序編譯時就會生成沒有任何調試信息的代碼。指針

分析幾個DEBUG宏
(1)應用程序中DEBUG宏
#ifdef DEBUG
#define DBG(...) fprintf(stderr, " DBG(%s, %s(), %d): ", __FILE__, __FUNCTION__, __LINE__); fprintf(stderr, __VA_ARGS__)
#else
#define DBG(...)
#endif

注:__FILE__等是C語言中的預約義宏,就是說這個東西是個宏定義,可是是C語言本身定義的。這些宏具備特殊的含義,譬如__FILE__表示當前正在編譯的c文件的文件名。

(2)內核中的DEBUG宏
#ifdef DEBUG_S3C_MEM
#define DEBUG(fmt, args...) printk(fmt, ##args)
#else
#define DEBUG(fmt, args...) do {} while (0)
#endif

 

相關文章
相關標籤/搜索