C陷阱與缺陷書摘 —前置處理器

來源:互聯網
上載者:User

預先處理:編譯之前,由c語言前置處理器對程式碼做的必要的轉換處理。

 

宏只對程式的文本起作用,它提供了一種對組成c程式的字元進行變換的方法,而不作用於程式中的對象。


1. 宏不是函數

 

#define abs(x) (((x)>=0)?(x):-(x))

宏定義中出現的括弧,它們的作用是預防引起與優先順序相關的問題。

 

即使宏定義中的各個參數與整個結果運算式都被括弧括起來,也仍然還可能有其他問題存在,比如說,一個運算元如果在兩處被用到,就會被求值兩次。

 

2. 宏不是類型定義

 

宏的常見用途是:使多個不同變數的類型可在一個地方說明。

 

#define FOOTYPE struct foo

FOOTYPE a,b;

 

但是,我們最好還是使用類型定義:

 

typedef struct foo FOOTYPE;

該語句定義FOOTYPE為一個新類型,與struct foo完全等效。

 

下面例子說明了為什麼最好使用類型定義:

 

#define PCHAR char*

typedef char* pchar;

 

PCHAR p1, p2;

pchar p3, p4;     (notes:這段聲明取自sponeliu的blog)

 

根據上下文,似乎是想將p1,p2,p3,p4都聲明為char*類型的,但是,事實是如此嗎?p2是嗎?p2並沒有預期成為一個char*類型,因為define會在預先處理階段展開,所以語句1就相當於 char* p1, p2;而在這條語句下,p2不是一個指標,而是一個char類型變數!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.