C語言 預處理器

2021-10-02 00:27:22 字數 2882 閱讀 5900

6、gcc編譯器檢視替換後的編碼

7、標頭檔案相互包含導致的重定義錯誤 指令

描述#define

定義巨集#include

包含乙個源**檔案

#undef

取消已定義的巨集

#ifdef

如果巨集已經定義,則返回真

#ifndef

如果巨集沒有定義,則返回真

#if如果給定條件為真,則編譯下面**

#else

#if 的替代方案

#elif

如果前面的 #if 給定條件不為真,當前條件為真,則編譯下面**

#endif

結束乙個 #if……#else 條件編譯塊

#error

當遇到標準錯誤時,輸出錯誤訊息

#pragma

使用標準化方法,向編譯器發布特殊的命令到編譯器中

#define max_array_length 20
//取消已定義的 file_size,並定義它為 42。

#undef file_size

#define file_size 42

//只有當 message 未定義時,才定義 message

#ifndef message

#define message "hello world!"

#endif

//如果定義了 debug,則執行處理語句。

#ifdef debug

/* your debugging statements here */

#endif

ansi c 定義了許多巨集,可以在程式設計時直接使用,但是不能直接修改這些預定義的巨集。巨集描述

__date__

當前日期,乙個以 「mm dd yyyy」 格式表示的字元常量。

__time__

當前時間,乙個以 「hh:mm:ss」 格式表示的字元常量。

__file__

這會包含當前檔名,乙個字串常量。

__line__

這會包含當前行號,乙個十進位制常量。

__stdc__

當編譯器以 ansi 標準編譯時,則定義為 1。

#include

main()

輸出:

file :a.c

date :jan 8 2020

time :21:43:37

line :8

ansi :1

乙個巨集通常寫在乙個單行上。但是如果巨集太長,乙個單行容納不下,則使用巨集延續運算子(\)

#define msg "hello \

world"

當需要把乙個巨集的引數轉換為字串常量時,則使用字串常量化運算子(#)。在巨集中使用的該運算子有乙個特定的引數或引數列表。

#include

#define msg(a,b) \

printf("i am " #a",i am "#b)

intmain

(void

)

輸出:

i am chuhe,i am 20

它的作用是先分隔, 然後進行強制連線

#define a1(name,type)   type name_##type##_type

#define a2(name, type) type name##_##type##_type

a1(a1,

int)

;/* 等價於: int name_int_type; */

a2(a1,

int)

;/* 等價於: int a1_int_type; */

解釋:

(1). 在第乙個巨集定義中,預處理器會把name_##type##_type解釋成3段:name_type、以及_type,這中間只有type是在巨集前面出現過的,所以它可以被巨集替換.

(2). 而在第二個巨集定義中,所以預處理器會把name##_##type##_type解釋成4段:name_type以及_type,這其間,就有兩個可以被巨集替換了.

例如,計算乙個數的平方:

int

square

(int x)

用巨集重寫

#define square(x) ((x) * (x))
再如:

#define max(x,y) ((x) > (y) ? (x) : (y))
#include

#define square(x) ((x) * (x))

intmain()

假設上述**檔名為a.c執行以下命令:

gcc a.c -e
可看到,預編譯後的**

int

main()

#ifndef a_h			

//a_h可以隨便寫,通常是把頭檔案的.換成_

#define a_h 1 ..

.//包含需要的標頭檔案

#endif

C語言 預處理器

如果想在下一行延續指令,則在當前行末尾使用 字元 帶引數的巨集 define max x,y x y x y define is even n n 2 0 則i max j k,m n if is even i i 將被替換為 i j k m n j k m n if i 2 0 i 巨集的替換列表...

C語言 預處理器

指令 描述 define 定義巨集 macro include 包含乙個源 檔案 undef 取消已定義的巨集 ifdef 如果巨集已經定義,則返回真 ifndef 如果巨集沒有定義,則返回真 if如果給定條件為真,則編譯下面 else if 的替代方案 endif 結束乙個if.else條件編譯塊...

C語言 預處理器

3 條件編譯 4 檔案包含include 5 其他指令 預處理階段會執行這些指令。file 進行編譯的源檔名 line 檔案當前的行號 date 檔案被編譯的日期 time 檔案被編譯的時間 define suqre x x x 如果乙個現存的名字需要重新定義,那麼舊的定義首先必須要用 undef ...