標籤:style blog http color io 使用 ar 檔案 sp
一、什麼是預先處理指令
預先處理指令是告訴編譯器在編譯之前預先處理的一些指令,有宏定義,檔案包括,條件編譯。
預先處理指令一般以 # 號開頭,能夠出如今檔案的不論什麼地方,作用於整個檔案。 二、宏定義
宏定義分不帶參數的和帶參數的宏定義。
1?不帶參數的宏定義
#import <stdio.h> #define AGE 10 // 宏名用大寫 int main() { int age = AGE; // AGE在編譯之前會替換成 10 printf("%d", age); return 0; } 在編譯器編譯之前,代碼中的全部AGE會被替換成 10 ,當AGE的值要改動的時候僅僅須要在定義宏的地方改動一次,檔案裡的全部AGE都會被替換成新的值。
因為宏是在編譯之前被替換,所以由此引起的語法錯誤僅僅有等到編譯的時候才會對已經被替換在宏名作語法檢查。
能夠在定義一個宏時,引用已經定義的宏,如:
//// main.m// 預先處理指令//// Created by 葬花 橋 on 14-5-18.// Copyright (c) 2014年 itcast. All rights reserved.//#import <stdio.h>#define AGE 10 // 宏名用大寫#define AGE2 AGE+10 // 引用已經定義的宏int main(){ int age = AGE; // AGE在編譯之前會替換成 10 int age2 = AGE2; printf("age1=%d\nage2=%d", age, age2); return 0;}
2?帶參數的宏定義
帶參數的宏定義和看起來和函數有點相似 ,可是它們的本質的差別,宏定義僅僅是替換,不分配記憶體,沒有參數的傳送,更沒有返回值。
#define SUM(a,b) a+b // 帶參數的宏定義
這裡的宏SUM帶有參數,使用時會替換成這樣:
三、檔案包括
檔案包括先行編譯指令我們都在用,#include<> #import 等等
它會將目標檔案的內容拷貝一份到當前檔案裡,這非常easy,沒有什麼能夠多說的。僅僅是要注意反覆包括,迴圈包括造成的錯誤,反覆定義錯誤或迴圈包括錯誤。
可是假設用到了條件編譯就能避免反覆包括引起的反覆定義錯誤。
四、條件編譯
#if defined(SUM) printf("SUM已經被定義!\n"); #endif 這現個預先處理指令表示假設SUM已經被定義就編譯printf語句,與些相反的是
#if !defined(SUM) printf("SUM沒有被定義!\n"); #endif
假設SUM沒有被定義,就編譯printf語句
與這兩個同樣作用的是
#ifdef SUM // 與#if defined(SUM)同樣 #endif #ifndef SUM // 與#if !defined(SUM)同樣#endif
那麼在檔案包括時,使用條件編譯就能夠防止反覆包括同一個檔案。
C學習筆記之預先處理指令