當我注意到在Commenting your Code
部分中,它建議避免使用指針和#defines,我在查看Arduino的StyleGuide。在Arduino中編程時避免指針和#defines?
作者說這是否有一個原因?關於他/她爲什麼這麼說,沒有解釋。這對我沒有意義。這是特定於嵌入式系統的東西嗎?
當我注意到在Commenting your Code
部分中,它建議避免使用指針和#defines,我在查看Arduino的StyleGuide。在Arduino中編程時避免指針和#defines?
作者說這是否有一個原因?關於他/她爲什麼這麼說,沒有解釋。這對我沒有意義。這是特定於嵌入式系統的東西嗎?
我不知道作者編寫它的具體原因,我不熟悉圖書館的書面風格 - 所以我要回答一般的C++程序。
我假設給出的偏好是因爲現代C++通常傾向於其他成語,其中許多成語被設計爲避免或最小化經常由預處理器和原始指針引入的問題。
避免指針
代替指針,它是在C++中使用的對象或一個容器的引用常規諸如用於對象的集合的矢量。
//////// For an object
//// Using a pointer
bool getURL(t_url* const outUrl);
// In use:
bool result(obj.getURL(&outUrl));
//// versus using a reference
bool getURL(t_url& outUrl);
// In use:
bool result(obj.getURL(outUrl));
//////// For a collection
//// Using a pointer
bool apply(const double* const values, const size_t& count);
// In use:
bool result(obj.apply(array, count));
//// versus using a container
bool apply(const std::vector<double>& values);
// In use:
bool result(obj.apply(values));
即使指針可給予對象容器(自動指針,智能指針,共享指針,弱指針),因爲與原始指針打交道時,特別是在客戶的代碼可以有很多的複雜性和模糊性。我很少寫C++程序來獲取或返回原始指針。
避免定義
預處理/定義通常也不在C++中的首選方法 - 你有內聯函數,匿名命名空間,模板和枚舉。
由於許多原因,存在問題的宏的無處不在的示例是#define max(a,b) ((a > b) ? a : b)
,而不是std::max
。
結論
如果我看到一個C++程序,其採用了相當多的不是,我發現自己想知道它是寫什麼的十年,或者如果提交人是在「C多用一些寫功能「方言。
另一個回答者說「建議是垃圾」。我不同意。 Arduino的建議只是說'避免指針'和'避免#定義'。當然,有些時候您需要使用這些設施,但是當您使用旨在替換它們的語言和圖書館設施時(使用這些設施的方式被濫用或出現問題),您可以編寫更清晰的程序。避免使用它們意味着要謹慎地使用它們,並且只有在必要時才使用它們,這有利於更現代和習慣的選擇。
該建議是垃圾指針是一個非常有用和強大的工具,並且通常需要它們纔能有效地執行某些操作。
#define
S,而另一方面,通常應避免使用有利於內聯函數的一些原因(onetwothreefour),但同樣也有其中的宏應使用是最好的解決方案很多情況下。這取決於你的問題 - 要聰明,知道何時使用它們,何時不使用它們。不要盲目避免使用它們,因爲有些FAQ告訴你不要這樣做。
我發現引用(解釋爲「其他對象的別名」)比指針(它有一個奇怪的語法和很多陷阱)更容易被新手理解,所以當你可以使用引用時避免指針可能是一個好建議另一方面有一種常見的觀點,即通過引用您不會立即看到函數調用可以改變您傳遞的對象 - 但是如果接口設計良好,應該清楚哪些參數將被修改) –
最有可能是因爲風格指南旨在使代碼「初學者友好」。我發現很難認真推薦'if(somethingIsTrue == TRUE)'的東西。爲什麼不讓它'if(somethingIsTrue == TRUE == TRUE == TRUE == TRUE)'? – Mankarse
好點。那麼爲什麼首先提到它們呢?初學者不一定會知道指針/定義。根據你的反應,我猜他只是說,在學習使用arduino時避免任何複雜情況,即使人們熟悉概念並且有經驗。 –
@Mankarse:因爲連續的'== TRUE'是不夠的,所以它真的很有趣。 – Daniel