C和指標 (pointers on C)——第十四章:前置處理器

來源:互聯網
上載者:User

標籤:c   指標   前置處理器   

第十四章 前置處理器


我略過了進階指標話題那一章。太多的小技巧和太多的學術性探討並不適合現在的我。不過我確實是讀了,很多地方沒有讀懂,如果誰讀了私下可以交流一下。有的小技巧還是非常有意思。
前置處理器這一章的內容,大家肯定都用過,什麼#include,#define #ifdef #undef這些,但是絕對用的不多。作為全面瞭解學C,還是應該都看一看。
前置處理器用法很講究,用不好會失誤,用好了會大大加快運行時速度(不是編譯速度)。


總結:
C程式的第一個步驟就是預先處理,前置處理器共包含以下幾個符號:
1、#define
定義宏,替換作用。
它把一個符號名與任意的字元序列聯絡在一起。例如,這些字元可能是一個字面值常量、運算式或者程式語句。這個語句到末尾結束,不需要;
如果過長的話可以用一個反斜線,如:
#define PRINT(FORMAT,VALUE) \
printf("The value of " #VALUE\
" is " FORMAT "\n", VALUE)
...
PRINT("%d", X+3);
output: The value of x+3 is 25.
這裡面#VALUE相當於把一個宏參數轉換為一個字串。
有些可以用函數實現的也可以用宏實現,宏的優點就在於它與類型無關。而且宏的執行速度快於函數。因為他不存在函數調用返回的開銷,在編譯的時候就已經弄好了。
缺點就是使代碼過長,同時具有不可預測的副作用,函數在這方面更容易預測。比如可能會執行多次(意料之外),可能會涉及優先順序的問題。
兩者不同也在於,命名規範也不同,比如max(a,b);和MAX(a,b);


2、#ifdef #undef #endif
屬於條件編譯,#undef指令可以使一個原來定義好的名字被忽略。


3、#if #elif #else
這三者也屬於條件編譯,分別是這樣,如果(#if),當滿足什麼條件就怎樣(#elif),如果都不成立就(#else)。
功能較#ifdef這組更加強大,有點兒像switch case語句。


4、#include 
實現檔案包含 。
經常有這兩種形式#include "XXX.h"或者#include <XXX.h>,區別在於,""是在源檔案路徑下的標頭檔,<>是庫檔案路徑下的標頭檔。
檔案包含可以嵌套,但是不要超過兩層。因為會造成多次包含同一個檔案的危險。
有人說這個容易,增加個:
#ifdef _HEADERNAME_H
#define _HEADERNAME_H
...
#endif
這個經常出現在大型程式中,但是會增加編譯速度。


5、#error,#line,#progma
#error,在編譯的過程中會產生一條錯誤資訊,新資訊中包含的是你所選擇的文本。
#line,告訴編譯器下一輸入的行號。
#progma,文法因特性而異。


警告:
1、不要在一個宏定義的末尾加上分號。
2、在宏定義中使用參數,但忘了在他們周圍加上括弧。
編程原則上,宏定義參數需要各種加括弧的。
3、忘了在整個宏定義的兩邊加上括弧。
2和3均會因為優先順序的問題造成不可預知的錯誤。


編程提示:
1、避免用#define指令定義可以用函數實現的很長序列的代碼。
程式的長度會極大極大的增長!!
2、在那些對錶達式求值的宏中,每個宏參數出現的地方都應該加上括弧,並且在整個宏定義的兩邊也要加上括弧。
3、避免使用#define宏建立一種新語言。
建立以後可能最終連你都不知道這種語言是什麼了。
4、採用命名規範,使程式員很容易看出某個標識符是否為#define宏。
5、只要合適就應該使用檔案包含,不必擔心它的額外開銷。
這個開銷真的很小,而且只存在與編譯中,運行中是沒有的。
6、標頭檔只應該包含一組函數或者數組的聲明。
7、把不同集合的聲明分離到不同的標頭檔中可以改善資訊隱藏。
8、嵌套的#include檔案使我們很難判斷源檔案之間的依賴關係。
所以盡量減少#include檔案的嵌套。


問題:
1、#define與字面值常量的優點。
可讀性好,可以給常量起個自己能看懂的名字。
如果想修改常量的數值,只需要修改define的內容就行,方便。
2、編寫一個用於調試的宏,列印出任意的運算式,它被調用時應該接受兩個參數。第1個是printf格式碼,第2個是需要列印的運算式。
#define DEBUG_PRINT(format, value)  printf("File %s, line %d: %s = " format "\n",\
__FILE__, __LINE__, #value, value);

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.