昨天在適配iPhone X的時候,想寫個if宏的,結果各種錯誤,查了資料后才發現我還是太年輕了,很多東西都沒弄懂。哎,基礎還是非常重要的啊。這里記錄的就是條件編譯。條件編譯,就 是通過預編譯指令設置編譯條件,在不同的需要時編譯不同的代碼。 例如我昨天想做的適配iPhone X(寫的時候iPhone X剛出來,適配也不知道怎么搞的好,都是在摸索,以后如果有好方法了這里就改了),我想洗個條件編譯,在iPhone X上 定義一種宏,在其他設備上同樣的宏但是代碼不同。
常用的條件編譯
#if, #elif,#else,#endif,#ifdef、#ifndef
看名字就知道,跟我們平時用的if、elseif、else是 一樣的,不同的是這里一定要記得 #endif。
#if 條件 1
代碼 1
#elif 條件 2
代碼 2
#else
代碼段 n+1
#endif
- 意思跟我們平常寫的代碼一樣,如果條件1成立,則編譯代碼1,如果條件二成立,則編譯代碼2,否則編譯代碼3.
- 預編譯指令中的這里的條件(表達式)與C語言本身的表達式基本一至如邏輯運算、算術運算、位運算等均可以在預編譯指令中使用。
- C語言的代碼是先編譯再執行(OC/C++也是),預編譯指令是在編譯之前處理的,通過預編譯進行宏替換、條件選擇代碼段,然后生成最后的待編譯代碼,最后進行編譯。
- 務必不能忘了#endif。
1.#if的使用
#if 表達式
代碼
#endif
if的后面接的是表達式,如果表達式成立,那么就會把代碼編譯進去,(注意:是編譯進去,不是執行)
2.#if defined的使用
#if defined (宏)
代碼.
#endif
這個#if后面接的是一個宏,意思是前面的宏定義里面有沒有定義這個宏,如果定義了,編譯器就會編譯中間的代碼,如果沒有定義,那就不會編譯,不管這個宏定義的是什么東西,對不對等。
#ifdef的使用
ifdef的使用和#if defined()的用法是一樣的。
ifndef又和#if !defined()的用法一樣(取反的意思)。
雖然條件編譯看著很簡單,但是實現起來就比較復雜了,條件多的情況下#if 得套好幾層。。。我用到的目前就這么多,更加高深的用法以后用到了再研究補充。