极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14999|回复: 6

网上看到这样的arduino if语句,有问题吗?

[复制链接]
发表于 2015-4-1 15:07:52 | 显示全部楼层 |阅读模式
#if ARDUINO >= 100
语句1
#else
语句2
#endif
该语句编译通过。问:if前面加“#”是什么意思?if后面的条件表达式不是要有括号吗?请指点
回复

使用道具 举报

发表于 2015-4-1 16:16:58 | 显示全部楼层
這些 # 開頭的是屬於 preprocessor directives, 跟程式中的 if / else 有很大的分別.

preprocessor directives 是在 compile 過程中執行的, 例如你的例子中, 如果 ARDUINO >= 100, 語句 1 加入程式中, 否則 語句 2 會加入程式中, 然後進行程式的 compile.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-1 16:36:32 | 显示全部楼层
Super169 发表于 2015-4-1 16:16
這些 # 開頭的是屬於 preprocessor directives, 跟程式中的 if / else 有很大的分別.

preprocessor dire ...

谢谢,那请问什么情况下在前面加#?我在C语言里面没见过这种情况。
回复 支持 反对

使用道具 举报

发表于 2015-4-1 16:58:33 | 显示全部楼层
一般 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 完成.   
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-1 17:03:53 | 显示全部楼层
Super169 发表于 2015-4-1 16:58
一般 c 語言中的 if, 是針對程式執行時的變化而作出不同的處理.

而 # 是根據預設的環境變化而作出不同的 ...

非常感谢回答,受益匪浅
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-4-1 17:04:18 | 显示全部楼层
        已解决问题
回复 支持 反对

使用道具 举报

发表于 2015-4-1 17:08:20 | 显示全部楼层
還有一個很常用的例子, 就是在頭文件中用到.
因為同一個頭文件, 可能會被不同的庫加進去, 但頭文件中的設定不可以重複的.
所以, 一般每個頭文件會有一個自己的名稱設定, 在文件開頭先檢查一下是否已設定了, 如果沒有就執行一次並進行設定.  如果已經設定了就把整個頭文件略去, 不用重複了.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-8 01:31 , Processed in 0.034497 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表