《C和指標》第14章 預處理器

2021-08-26 16:51:18 字數 1373 閱讀 1010

14.2.1 巨集

#define包括乙個規定,允許把引數替換到文字中,這種實現通常稱為巨集(macro)。

#define square(x) x * x

則程式中的square(5)會被替換成:5 * 5

警告:例1:

a = 5;

printf("%d\n", square(a + 1));

會被替換成5 + 1 * 5 + 1,列印結果是11,不是36。

例2:#define square(x) (x) + (x)

a = 5;

printf("%d\n", 10 * square(a));

會變成10 * 5 + 5,列印結果是55,不是100。

正確定義為:#define square(x) ((x) + (x))

因此,所有用於求值的巨集定義都應該加上括號,避免使用巨集時,

由於引數中的操作符或鄰近操作符之間不可預料的相互作用。

14.2.3 巨集與函式

#define max(a, b) ( (a) > (b) ? (a) : (b) )

為什麼不用函式來完成這個任務?

1. 用於呼叫和從函式返回的**可能比實際執行這個小型計算的**更大。

2. 函式的引數必須宣告為一種特定的型別,而巨集與型別無關。

3. 有些任務根本無法用函式實現:

#define malloc(n, type) ( (type *)malloc( (n) * sizeof(type) ) )

pi = malloc(25, int);

pi = ( (int *)malloc( (25) * sizeof(int) ) );

14.2.7 命令列定義

c編譯器允許在命令列中定義符號。當根據同乙個原始檔編譯乙個程式的不同版本時很有用。

int array[array_size];

cc -darray_size=100 prog.c

14.3 條件編譯

避免為每個版本編寫一組不同的原始檔。因為各組原始檔的絕大多數**都是一樣的。

void fun1(arguments)

14.4 檔案包含

多重包含常出現在大型程式中。要解決這個問題,所有的標頭檔案要這樣寫:

#ifndef _headername_h

#define _headername_h 1

/*** all the stuff that you want in the header file

*/#endif

必須記住預處理器仍將讀入整個標頭檔案,即使這個檔案的所有內容將被忽略。

C和指標(第14章 預處理器)

程式編寫,編譯第一步就是巨集的宣告,也稱預處理器階段,在編譯之前,有刪除注釋,插入被 include指令包含的檔案的內容 和 define所替換的符號等。14.1 五種預處理符號 file name.c 進行編譯的源檔名 line 25 檔案當前的行號 date jan 14 2019 檔案被編譯的...

第14章 預處理器

c預處理器在源 編譯之前對其進行一些文字性質的操作。它的主要任務包括刪除注釋 插入被 include指令包含的檔案的內容 定義和替換由 define指令定義的符號以及確定 的部分內容是否應該根據一些條件編譯指令進行編譯。在 define中,如果定義的內容很長,可以分成幾行,除了最後一行之外,每行的末...

C和指標 學習筆記 第14章 預處理器

c預處理器在源 編譯之前對其進行一些文字性質的操作。它的主要任務包括刪除注釋 插入被 include指令包含的檔案的內容 定義和替換由 define指令定義的符號以及確定 的部分內容是否應該根據一些條件編譯指令進行編譯。1.預定義符號 預處理器定義的符號,它們的值或者是字串常量,或者是十進位制數字常...