# Camera OV7670 第01段 if和#if差別 ```javascript= // set EXAMPLE to EXAMPLE_UART in setup.h to activate #include "setup.h" #if EXAMPLE == 3 #include "Arduino.h" #include "CameraOV7670.h" ``` ## if和#if差別 ### 解釋1 Difference between if and #if The "#if" condition is evaluated only at compile time. (僅在編譯時評估) The "if" is evaluated at run time.(在運行時進行評估) (參考網址{https://forum.arduino.cc/t/difference-between-if-and-if/464673}) ### 解釋2 這些 # 開頭的是屬於 preprocessor directives(預處理器指令), 跟程式中的 if / else 有很大的分別. preprocessor directives 是在 compile 過程中執行的, ```javascript= #if ARDUINO >= 100 #else #endif ``` 如果(#if) ARDUINO >= 100, 加入程式中, 否則(#else) 會加入程式中, 然後進行程式的 compile. 一般 c 語言中的 if, 是針對程式執行時的變化而作出不同的處理. #### 應用狀況 - 而 # 是根據預設的環境變化而作出不同的處理, 例如 你的例子中, 是針對 ARDUINO IDE 而作出不同處理. 因為 ARDUINO IDE 在不同版本, 可能針某些設定有不同的做法, 這些都跟執行過程無關, 而要是在 compile 時已決定了. - 另一個情況可能是為了縮減程式的空間, 這是很常用的, 例如你的寫了一個多用途的程式, 可以連接多個不同的模塊, 最簡單就是 針對不同芯片的顯示程式, 如果每次都把所有芯片的程式加進去, 當中加入大量的 if 在執行時處理, 有好處亦有壞處. 好處是如果你有辦法在封行時得知所用的芯片, 你就可以隨時更換芯片, 而不需要再 compile 程式. 但壞處就是程式中加入很多用不到的東西, 正常你只會用一種芯片, 但其他芯片有關的程序都要加進去, 執行時又要不斷選擇有關程序, 對資源運用非常不智. - 所以, 大多數可兼顧不同芯片的庫, 都會由用家以 #define 的形式設定要使用的芯片, 之後就會加入一些 #ifdef 之類的句子, 只選取有關的程式加進去. 最後執行的程式就可以大大縮小了, 而且也不需要在執行中加入 if / switch 之類的判斷, 去決定使用那一套芯片的指令. - 此外, 也可以用 #define 去開關一些 debug 用的程式. 在測試時設定 (例如#define SERIAL_DEBUG), 在發出 debug 資訊的程式前先檢查是否設定了 SERIAL_DEBUG. 當程式測試完成後, 就取去設定的一句, compile 時就不會加進 debug 資訊. 將來再有除蟲的需要時, 只要再設定 SERIAL_DEBUG, 再 compile 一次程式就可以了. - 當然, 還可以有很多不同的閞關設定, 或程式變化可以用 preprocessor directives 完成. - 同一個頭文件, 可能會被不同的庫加進去, 但頭文件中的設定不可以重複的.所以, 一般每個頭文件會有一個自己的名稱設定, 在文件開頭先檢查一下是否已設定了, 如果沒有就執行一次並進行設定. 如果已經設定了就把整個頭文件略去, 不用重複了. (參考網址{https://www.geek-workshop.com/thread-14461-1-1.html})