編譯預處理指令
#開頭的是編譯預處理指令
它們不是c語言的成分,但是c語言程式離不開它們
#define用來定義乙個巨集
如
#define pi 3.14159
這樣pi這個東西就是3.14159的值
在編譯過程中,計算機會把**中出現的pi全部換成3.14159
也可以有如下定義
#define format "%f\n"
那麼,形如
printf(format,2*pi*3.0);
實際上就是
printf("%f\n",2*pi*3.0);
如果給format這個部分加上引號
printf("format",2*pi*3.0);
這樣會**的
#define總結
#define 《名字》《值》
注意沒有結尾的分號,因為不是c的語句
名字必須是乙個單詞,值可以是任何東西
在c語言的編譯器開始編譯之前,編譯預處理程式(cpp)會把程式中的名字替換成值(完全的文字替換)
這就是叫做c語言的巨集:
1.如果乙個巨集的值中有其他的巨集的名字,也是會被替換的
2.如果乙個巨集的值超過一行,最後一行之前的行末需要加
3.巨集的值後面出現的注釋不會被當做巨集的值的一部分
對於2的使用方式是這樣:
#define prt printf("%f",pi);\
printf("%f",pi2);
這樣在函式中使用prt;那麼就會執行這2個printf
預定義的巨集:
_file_ 輸出路徑(%s)
_line_ 輸出行號(%d)
_date_ 輸出日期(%s)
_time_ 輸出時間(%s)
帶引數的巨集
巨集可以帶引數,形如
#define cube(x) ((x)*(x)*(x))
使用方法:
printf("%d\n",(5));
這樣計算機在編譯的時候就是
printf("%d\n",(5*5*5));
巨集定義的誤區:
#define radtodeg1(x) (x * 57.29578);
#define radtodeg1(x) (x) * 57.29578;
會導致許多錯誤,在有帶引數的巨集的時候,一切都要用括號括住,如
#define radtodeg1(x) ((x * 57.29578));
巨集定義加分號可能導致的情況:
#define pretty_print(msg) printf(msg);
if(n<10)
pretty_print("aaa");
else
pretty_print("bbb");
如果在巨集定義上加了分號,那麼對於編譯的時候來說,在語句結束後又來了乙個分號,相當於加了個空行 這樣if和下面的else就連線不上關係了,對於編譯接收過來的資訊,就只有單單乙個if語句
帶引數的巨集
在大型程式的**中使用非常普遍
可以非常複雜,如「產生」函式(在#和##這兩個運算子的幫助下)
存在中西方文化差異(西方人很喜歡)
部分巨集會被inline函式(c++)替代
巨集定義 C語言基礎學習筆記
define include ifndef define maxszie 10000帶引數的巨集 define add x,y x y define plus x,y add x,y define add x,y x y 呼叫 plus plus a,b c 呼叫結果 就是按照順序巢狀 最終 c b...
C語言學習筆記 巨集定義
define 叫做巨集定義命令,它也是c語言預處理命令的一種。所謂巨集定義,就是用乙個識別符號來表示乙個字串,如果在後面的 現了該識別符號,那麼就全部替換成指定的字串。巨集定義是由源程式中的巨集定義命令 define完成的,巨集替換是由預處理程式完成的。define 巨集名 字串 表示這是一條預處理...
c語言學習筆記之巨集定義
1 巨集名的命名規範 全部大寫有多個單詞中間使用下劃線隔開 常用 以k開頭的駝峰標識 不常用 2 程式執行過程 源 編譯預處理 編譯 鏈結 執行 3 編譯預處理指令 在編譯前進行解析處理的指令 編譯預處理指令包括 1.巨集定義 define 1.1 不帶引數巨集定義 1.2 帶引數的巨集定義 2.條...