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 ...