# 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})